0

Windows バッチ ファイルを使用してコマンドを実行し、その出力を別のコマンドにパイプして、最初のコマンドの終了ステータスを取得しようとしています。しかし、Windows バッチ ファイルが非常に難解であり、テクニックを見落としている可能性があることは認めますが、どうやらそれはできないようです。 コマンドの終了ステータスをキャプチャし、その出力をパイプするにはどうすればよいですか?

定番の使い方ですが、成功do_a_thing | tee logfile.txtしたかどうかチェックできるようにしたいです。do_a_thingいろいろいじったり、グーグルで調べたり、StackOverflow を読んだりした後、次のことを思いつきました。

setlocal enabledelayedexpansion
set rc=-1
( false & set rc=!errorlevel! & echo rc=!rc! ) | tee logfile.txt
echo %rc%

私が期待していたものは次のとおりです。

C:\>test.bat 
C:\>setlocal enabledelayedexpansion 
C:\>set rc=-1 
C:\>(false & set rc=!errorlevel!   & echo rc=!rc!  ) | tee logfile.txt
rc=1 
C:\>echo 1
1

しかし、残念ながら、そうではありませんでした:

C:\>test.bat
C:\>setlocal enabledelayedexpansion
C:\>set rc=-1
C:\>(false & set rc=!errorlevel! & echo rc=!rc! ) | tee logfile.txt
rc=!rc!
C:\>echo -1
-1

" " を削除すると| tee logfile.txt、 の期待値が生成されます!rc!が、もちろん、ログ ファイルをキャプチャすることはできません。

C:\>test.bat
C:\>setlocal enabledelayedexpansion
C:\>set rc=-1
C:\>(false & set rc=!errorlevel! & echo rc=!rc! )
rc=1
C:\>echo 1
1
4

1 に答える 1

2

パイプの各側は、デフォルトで遅延展開がオフになっているコマンドラインコンテキストの独自のコマンドシェルで実行されるため、あなたがしようとしていることは機能しません。パイプされたコード ブロック内で遅延展開が失敗するのはなぜですか?を参照してください。詳細については。受け入れられた回答はすべてを説明し、他の回答は受け入れられた回答にコンテキストを与えるのに役立ちます。

最も簡単な解決策は、エラー コードを一時ファイルに書き込み、コマンドの完了後にそのファイルを変数に読み込むことです。

( false & call echo %%^^errorlevel%%>returnCode.txt ) | tee logfile.txt
set "rc="
<returnCode.txt set /p "rc="
del returnCode.txt
echo rc=%rc%

CALL ステートメントは、コマンドの実行後に発生する別のレベルの解析を提供します。トリックは、テストしているコマンドが実行されるまで、OF %errorlevel% の展開を遅らせることです。コマンド コンテキストでは、単純にCALL ECHO %^ERRORLEVEL%. ただし、コマンド ラインは、コマンド コンテキストに到達する前にバッチ コンテキスト解析も通過する必要があるため、パーセントを as として%%、キャレットを as としてエスケープする必要があります^^

于 2012-11-12T17:43:12.113 に答える