2

コマンドを呼び出すバッチ ファイルを作成していて、発生する可能性のあるエラーを処理したいと考えています。ネイティブ CLI コマンドのみを使用する必要があります。つまり、PowerShell などを使用していれば、これを簡単に実行できることはわかっていますが、そうではありません。

私が望むのは、エラーが発生した場合は出力を確認し、エラーが予想される場合は処理を続行し、そうでない場合は中止することです。ただし、有用な方法で出力を解析するのに問題があります。

これは私が得ることができる限り近いようです:

command | (find /i "valid" >NUL && goto :okay || goto :stop)

ここでは、コマンドの出力を にパイプしていますfind。問題は、これがコマンドの終了ステータスに関係なく発生することです。成功メッセージと失敗メッセージの両方が送信されます。1つのオプションは次のとおりです。

command 1>NUL 2>(find /i "valid" >NUL && goto :okay || goto :stop)

ただし、ファイルにリダイレクトしようとしているため、これは機能しません。コマンドはfind入力を受け取りません。

(テスト目的でcommand、メッセージをエコーする cmd ファイルでありexit /b 1、エラー用です)

何か案は?

4

1 に答える 1

2

あなたが既知のものとしてリストしたものに基づいて

  • 成功すると、エラーレベル = 0
  • エラーの場合、errorlevel = 1。
  • エラーが発生すると、エラー メッセージが STDERR (2) ストリームに書き込まれます。
  • 「EXPECTED」エラーの場合、「valid」という単語が出力されます。

これを試して:

command 2>&1 1>nul | ( find /i "valid" >nul && goto okay || goto stop )

注: 出力のリダイレクトが行われる順序は重要です!

CMD はリダイレクトを左から右に解析します。これは、STDERR を STDOUT に向けてから、STDOUT を NUL に向けています。それらをポインターのように考えてください。STDERR は、STDOUT を NULL に設定する前に、STDOUT のアドレスを取得しています。

アップデート

  • エラーが発生すると、エラー メッセージが STDOUT (1) ストリームに書き込まれます。

オプション A:

call command > "%Temp%\out.txt" && goto okay || ( find /i "valid" "%Temp%\out.txt" >nul && goto okay || goto stop )

オプション B:

( call command && echo valid ) | find /i "valid" >nul && goto okay || goto stop
于 2013-10-10T18:20:50.057 に答える