web-dev-qa-db-ja.com

batファイルを使用してftpスクリプトの結果を確認するにはどうすればよいですか?

Ftpスクリプトを実行する.batファイルがあり、サーバーからファイルを取得して自分のマシンにコピーします。よく働く。

これらのエラーのいずれかが発生した場合は、この.batファイルで報告する必要があります。

これを行う方法の一般的な考え方を正しい方向に向けることができれば、それは素晴らしいことです。

ありがとう。

3
Tommy

正直なところ、固定FTPスクリプトを使用して大きな成功を収めたことはありません。戻りコードを処理したとしても、何が問題だったのかを正確に知ることは困難です。

代わりに、PowerShellまたはPythonをジョブに使用することをお勧めします。どちらも動的に制御できるFTPクライアントにアクセスできます。何が機能したか、何が失敗したかを正確に把握でき、その場で問題に対処します。

PSの簡単な例

$url = "ftp://ftp.foo.com/bar.txt"
$destination = "c:\foo\bar.txt"
$wc = New-Object System.Net.WebClient
$wc.DownloadFile($url, $destination)

もっと複雑なことをする必要がある場合は、まず http://msdn.Microsoft.com/en-us/library/ms229718.aspx これらの例はC#ですが、そうする必要があります。それらをPSに変換するのは非常に簡単です。

この方法で作成されたスクリプトは、ディレクトリを一覧表示し、必要なファイルをダウンロードするファイルをループできます。エラーがある場合は、ファイルごとのレベルで好きなように処理できます。

4
Cephas

BATファイルでそれを行う方法は次のとおりです。

出力とエラーを別々のファイルにリダイレクトしながら、FTPを呼び出します。エラーファイルが空白でない場合は、問題があります。

setFTPFILE、およびOUTPUTFILEというERRORFILE変数を作成したとすると、次のように機能します。

  1. FTPを呼び出し、出力とエラーを別々のファイルにキャプチャします。

    ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"
    
  2. FTP呼び出しが失敗したかどうかを確認します

    if  ERRORLEVEL 1 (
        echo Call to ftp returned an error. See file: %OUTPUTFILE%
        exit /b 1
    )
    
  3. FTPセッションにエラーが含まれていないか確認してください。これを行うには、エラーファイルのサイズを確認します。

    FOR /F "usebackq" %%A IN ('%ERRORFILE%') DO set ERRORFILESIZE=%%~zA
    if %ERRORFILESIZE% GTR 0 ( 
        echo Error while performing the FTP. See file: %ERRORFILE%
        exit /b 2
    )
    
2
Shez

Shez 上記の例は、ERRORLEVELを設定し、標準エラー(2>)から出力を生成する、ほとんどのDOSベースのプログラムからエラーをキャプチャするための優れた標準的な方法ですが、MSからのftp.exeはERRORLEVEL。スクリプト(-s:パラメータ)が成功するか失敗するかにかかわらず、ERRORLEVELはゼロのままです。このファイルは常にゼロバイトファイルになるため(ftp.exeは常にERROR_SUCCESSまたは0を返すため)、標準エラー(2>)を "%ERRORFILE%"にリダイレクトしても機能せず、空のファイルのみが作成されます。したがって、コマンド文字列は次のとおりです。

ftp -i -s:"%FTPFILE%" >"%OUTPUTFILE%" 2>"%ERRORFILE%"

期待される結果が得られることはありません。 Microsoft FTPクライアントの使用を余儀なくされた場合、最善の策は、エラーを示す特定のテキスト文字列について%OUTPUTFILE%を解析するか、MS以外の別のFTPクライアント(IPSWITCH WS_FTPなど)を使用してエラートラップを改善することです。力ずくの方法でコーディングを終えたら、数時間で%OUTPUTFILE%を解析する方法のコード例をフォローアップします。ありがとう!

フォローアップ

インタラクティブなMicrosoftFTPセッションのサンプルについては、以下の2番目の投稿を参照してください。解析の例は次です... OK以下は Martijn S stackoverflow.comの投稿 ここ のバリエーションです。私のソリューションでは、FINDSTRと、検索条件を含む別のテキストファイルを使用しています。

次のテキスト文字列を含むテキストファイル(FTP_ERR_SEARCH_CRITERIA.txt)を作成します。

not connected
not found
failed

バッチ/コマンドファイルから次のサブルーチンを呼び出します。

::
::=============================================================================
:WIN_FTP_ERROR %1=%_SearchCriteria% %2=%_InputFile%
::=============================================================================
::
    set _SearchCriteria=%1
    set _InputFile=%2
    set _tokens="tokens=*"
    for /F %_tokens% %%G in ('findstr /I /G:%_SearchCriteria% %_InputFile%') do @echo "%%G"
exit /b

呼び出し:

call :WIN_FTP_ERROR ".\FTP_ERR_SEARCH_CRITERIA.txt" %OUTPUTFILE%

Microsoft FTP出力のサンプル

中断したところから続けます...何かがどのように機能するかを知る最良の方法は、インターネット上にある大量の誤った情報に頼るのではなく、自分でテストすることです。だからここに行きます。以下の例は、2つの異なるファイルを示しています:tst.txtおよびtst.tx(名前は微妙に異なりますが、まったく同じです)。 tst。txtファイルは存在しますが、tst。txは存在しません。

Microsoft FTPの例(わかりやすくするために間隔を追加):

ftp> put tst.txt
200 PORT command successful.
150 Opening ASCII mode data connection for tst.txt.
226 Transfer complete.
ftp: 44 bytes sent in 0.19Seconds 0.24Kbytes/sec.

ftp> put tst.tx
tst.tx: File not found

ftp> get tst.tx
200 PORT command successful.
550 tst.tx: The system cannot find the file specified.

ftp> get tst.txt
200 PORT command successful.
150 Opening ASCII mode data connection for tst.txt(44 bytes).
226 Transfer complete.
ftp: 44 bytes received in 0.00Seconds 44000.00Kbytes/sec.

ローカルファイルシステムとリモートファイルシステムが上記のコマンドにどのように応答するかに注意してください。

最初のputtst。txtコマンドの場合(ファイルはローカルファイルシステム)リモートサーバーがファイルを転送することで応答することがわかります。

2番目のputtst。txコマンド(ファイルtst.txどちらのシステムにも存在しません)ローカルファイルシステムがファイル名tst.txとエラーメッセージファイルが見つかりません

3番目のgettst。txコマンドの場合(ここでもファイルtst。 txは存在しません)リモートファイルシステム(実際にはリモートFTPホスト)が FTPエラーコード550で応答することがわかります、ファイル名tst.txおよびエラーメッセージシステムは指定されたファイルを見つけることができません。

4番目の最後のgettst。txtコマンド(ファイルは現在リモートシステムに存在します)リモートシステムが正常な転送で応答することがわかります。

なぜこのすべての説明?前の投稿のファイルを解析して、MSftp.exeから返されるエラーメッセージを確認するときに重要です。

2
Mark Ronollo

コンソールユーティリティがエラーが発生したことを示すコードを返すことはよくあることです。 ここ 。エラーの後にftpが終了すると、障害を示すゼロ以外のコードが返される可能性があります。 IMHOは、バッチファイル内のプログラムの出力を解析する簡単な方法はありませんが、エラーレベルを確認してログファイルを保存できます(出力ストリームリダイレクトを使用:command args >log)またはメールで送信してください。

1
whitequark

このエラーメッセージはFTP固有のエラーであり、ファイアウォールがデフォルトでFTP接続を無効にするためです(これは良いことです!)。

このメッセージはコンピュータに影響を与えないため、無視してかまいません。

1
Hartmut Jager