web-dev-qa-db-ja.com

バッチスクリプトでプログラムを実行し、プログラムが終了するのを待ってから続行します

私には非常に具体的な要件があります。秘密鍵を使用するsftp経由でファイルをアップロードしようとしています。ホストに接続してファイルをアップロードするbatファイルがすでにありますが、完了したらアップロードしたファイルを別のパスに移動する必要があります。

最初のbatファイルはstart.batと呼ばれます。これはsftpサーバーに接続し、ファイルをアップロードします。 winscpを使用してホストに接続しています。

2番目のbatファイルはdone.batと呼ばれます。これにより、ファイルが1つのディレクトリから別のディレクトリに移動します。

call done.batを使用して、最初から2番目のbatファイルを呼び出しています。私が抱えている問題は、最初のバッチファイルが認証、ログイン、アップロードの機会を得る前に、done.batが完了していることです。

アップロードが完了してからファイルを移動したいだけです。何らかの理由でアップロードが失敗した場合、2番目のファイルは実行されません。

BatファイルはWindows XPマシン上にあります。

5
PeanutsMonkey

使用する start /wait winscp ...ファイル転送を開始するには、winscpが終了するまでバッチスクリプトを一時停止します。その行の後にmoveコマンドを追加するか、call done.bat

 start /wait winscp ...
 call done.bat

これを Mark Allen によって提案されたエラーチェックと組み合わせる必要があります


個人的には、この種の問題を回避できると思うコマンドラインSFTPクライアント(PuTTYまたはOpenSSHで提供されるものなど)を使用します。

5
RedGrittyBrick

Start.batを変更して、winscp.exe側の障害を検出します。 winscp.exeが終了コード0で終了する場合にのみ、done.batを呼び出します。

次のようなものを試してください。

winscp.exe blah blah blah
if not errorlevel 0 goto end
call done.bat
:end

Winscp.exeがエラー時に1以上で終了すると想定しているだけであることに注意してください。 winscp.exeのドキュメントを確認してください。

以下を含むように編集します。

Winscp.exeが成功または失敗を示すために終了コードを使用しないとしましょう。あなたは何か違うことをする必要があるかもしれません。

winscp.exe /log=%temp%\wscpresults.log *other parameters here*
ping -n 300 -w 1000 127.0.0.1 > nul
find /i "success" %temp%\wscpresults.log
if errorlevel 0 goto end
call done.bat
:end

どこ:

  • Pingコマンドは、5分間待機する以外に何も実行しません(300 x1000msまたは1秒= 5分)
  • / logスイッチを指定すると、winscp.exeは操作の結果をファイルに書き込みます。
  • FindコマンドはWordの成功を探します-winscpが実際にファイルに書き込むものがわかりません。一度試して、すべてが機能したことを示す文字列を特定し、それを検索する文字列を変更する必要があります。
  • Findコマンドで「success」という単語が見つからない場合は、done.batを呼び出さずに「end」ラベルに移動します。それ以外の場合は、すべてが成功したと考え、done.batと呼びます。
4
Mark Allen