17

以下に示す例では、nmake を実行し、STDOUT/STDERR を tee にリダイレクトします。これにより、それが画面に送信され、ログ ファイルにも送信されます。問題は、tee ではなく nmake の終了コードを取得しようとしていることです。必要なのは、tee ではなく、nmake からの終了コードです。

nmake | tee output.txt
4

3 に答える 3

29

次のようなことができると思うかもしれませんが、うまくいきません。

(nmake & call set myError=%%errorlevel%%) | tee output.txt

問題は、Windows パイプが機能するメカニズムにあります。パイプの両側は、独自の CMD シェルで実行されます。したがって、そこで設定した環境変数は、コマンドが終了すると消えます。また、%errorlevel% の遅延展開は、余分なレベルの解析と、CMD シェルにバッチ コンテキストではなくコマンド ライン コンテキストがあるため、より複雑になります。

次のようなことができます。

(nmake & call echo %%^^errorlevel%% ^>myError.txt) | tee output.txt
for /f %%A in (myError.txt) do echo nmake returned %%A
del myError.txt

または、output.txt にエラーレベルを埋め込むこともできます。

(nmake & call echo nmakeReturnCode: %%^^errorlevel%%) | tee output.txt
for /f "tokens=2" %%A in ('findstr /b "nmakeReturnCode:" output.txt') do echo nmake returned %%A

上記の両方のソリューションは、バッチ スクリプトでコマンドを実行していることを前提としています。代わりにコマンド ラインからコマンドを実行している場合は、上記の両方のソリューションの
%^^errorlevel%代わりに%%^^errorlevel%%.

しかし、nmake はユーザー入力を必要とせず、通常は高速であるため、リアルタイムの監視はおそらく問題にならないことを考えると、最も簡単な解決策は次のようになります。

nmake >output.txt
set myError=%errorlevel%
type output.txt
echo nmake returned %myError%


- Windows パイプを使用する場合、多くの微妙な複雑さがあります。良い参考文献は、コードのパイプされたブロック内で遅延展開が失敗するのはなぜですか? . 質問とすべての回答を読むことをお勧めします。選択した回答には最良の情報が含まれていますが、他の回答はコンテキストを提供するのに役立ちます。

編集 2015-06-02

私は最近、DOSKEY マクロを使用して、一時ファイルに頼ることなく、パイプのいずれか (または両方) の側から ERRORLEVEL をきれいに格納および取得できることを発見しました。http://www.dostips.com/forum/viewtopic.php?p=41409#p41409で DosTips ユーザー Ed Dyreen からアイデアを得ました。DOSKEY マクロはバッチで実行できませんが、定義は ENDLOCAL および CMD /C 終了後も保持されます!

あなたの状況でそれを使用する方法は次のとおりです。

(nmake & call doskey /exename=err err=%%^^errorlevel%%) | tee output.txt
for /f "tokens=2 delims==" %%A in ('doskey /m:err') do echo nmake returned %%A

必要に応じて、最後にもう 1 つのコマンドを追加して、値を取得した後にエラー「マクロ」の定義をクリアすることができます。

doskey /exename=err err=
于 2012-06-24T13:52:15.593 に答える