0

FTP経由でファイルを転送するためにWin2003でバッチファイルを実行しています。

バッチ ファイルは、FTP セッションの結果を FIND にパイプして、226 成功メッセージがあるかどうかを確認します。これはうまく機能します。残念ながら、ファイルが正常に転送され、226 メッセージが返されたにもかかわらず、スケジューラからエラーレベルの状態に陥っています。

FTP -s:go.ftp 2>NUL | Find "226 Transfer OK" > NUL
If ErrorLevel 1 Echo ERROR - FTP transfer failed. >> err.log

ユーザー アカウントは管理者アカウントなので、権限の問題ではありません。何か案は?

アップデート:

226 メッセージはリダイレクト経由でキャプチャされていないため、FIND に失敗します。私のテストでは、スケジューラからの実行時に FTP 出力を別のファイルにリダイレクトしました。FTP コマンドは正常に実行されていますが、サーバーの応答がまったく表示されません。

これが私のFTPスクリプトです:

open ftpsite
username
password
dir
quit

これが出力です(FTP -s:go.ftp >ftp.log 2>ftp.err)。

User (ftpsite:(none)): open ftpsite
04-01-12  02:35PM       <DIR>          DIR1

04-01-12  02:35PM       <DIR>          DIR2

04-01-12  02:35PM       <DIR>          DIR3

04-01-12  02:35PM       <DIR>          DIR4



dir 
quit

さらに、エラー ストリームには何も表示されません ( 2>ftp.err )。少なくとも、FIND のエラーレベルがトリガーされない理由はわかりましたが、FTP サーバーの応答がキャプチャされないのはなぜですか? -v スイッチを使用していないか、詳細を切り替えていません。

4

2 に答える 2

1

スケジューラのパスに と のディレクトリが含まれていますFTPFIND?

の出力をFTP一時ファイルに保存し、それFINDをテスト目的でパイプできますか? そうすればFTP、事後に の出力を調べて、何が起こったのかを確認できます。

バッチ ファイルの出力でエラー メッセージの可能性を確認できるように、リダイレクトを省略 (または出力をエラー ログ ファイルに出力) するのはどうでしょうか。

于 2012-03-30T17:31:08.227 に答える
0

私はこれに出くわし、それ以外の場合は成功した一連の転送で 226 コードが 1 つ欠落していることを調査しました。私のftpコマンドはvbscriptから呼び出されていますが、それ以外はあなたのものと似ています:

ftp -i -n -s:"\path\to\cmdfile.txt" [ftpserver] > "\path\to\stdout.log" 2> "\path\to\stderr.log"

-n スイッチと匿名ログインのため、私のコマンド ファイルは若干異なります。

USER anonymous
cd [UploadDirectory]
binary
put [file]
quit

ご指摘のとおり、接続が失敗した場合でも、STDERR ストリームは常に空のように見えます。すべてのテストで、STDERR に情報が含まれているのを見たことがありません。ただし、STDOUT にはトランザクションの完全なログが含まれています。

220 Unauthorized access to this server is prohibited. All actions are logged.
USER anonymous
230-Anonmyous Access
230 Login successful.
cd [UploadDirectory]
250 Directory successfully changed.
binary
200 Switching to Binary mode.
put "[file]"
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
1058.3090.82quit
221 Goodbye.

あなたの例のようにコマンドを FIND にパイプする代わりに、STDOUT ファイルを解析しており、99% の確率で "226 Transfer complete." で一致します。1%の時間しか見ない

150 Ok to send data
quit

226 がない場合、ファイルは正常に転送され (??)、そのままの状態で表示されます。以上のことから、出力を FIND にパイプするほど洗練されていませんが、STDOUT ファイルを解析すると、目的の結果が得られるはずです。

私が考えることができる他のいくつかの項目:

  1. ほとんどのスケジューラー / cron の問題は、パスとパーミッションが原因です。MS Scheduler には「Start In (folder)」オプションが含まれています - それをバッチ ファイル ディレクトリに設定しようとしましたか? また、スケジュールされたジョブを実行しているユーザー アカウントには、バッチで使用されるすべてのファイルとフォルダーに対する明示的な (継承されていない) アクセス許可を付与する必要があります。バッチがコマンド ラインからは一貫して機能するが、スケジューラでは失敗する場合は、単にスケジューラのユーザー アカウントを管理者グループに追加するだけでなく、アクセス許可の問題が発生している可能性があります。
  2. サーバーの ftp ログには何が表示されますか? 私の ftp サーバーは vsftpd (Linux) であり、サーバー ログは基本的に、リダイレクトによってキャプチャされた STDOUT ストリームを模倣しています (いくつかの追加情報を含む)。これにより、転送成功コードが ftp サーバーから送信されているかどうかがわかります。
  3. おそらく原因ではありませんが、FIND で /I スイッチを使用して大文字と小文字を区別しないようにすることを検討してください。
  4. リダイレクトコマンドをいじってみましたか? 次のようなもの: ftp ... 2>&1 | 探す ...
于 2012-05-09T17:23:50.703 に答える