2012-06-23 11 views
15

以下の例では、nmakeを実行してからSTDOUT/STDERRをteeにリダイレクトし、それを画面に送信し、ログファイルにも送信します。 問題は、私がnmakeの終了コードを取得していて、それを取得しようとしていないことです。 私が必要とするのはnmakeの終了コードであり、teeではありません。Windowsコマンドインタープリタ:最初にパイプコマンドの終了コードを取得する方法

nmake | tee output.txt 

答えて

22

あなたは次のようなことができると思うかもしれませんが、動作しません。

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

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

あなたはこのような何か行うことができます:あなたはoutput.txtとでERRORLEVELを埋め込むことができ

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

しかし、最も簡単な解決策があると思われるが

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


- Windowsパイプで作業するときには、多くの微妙な問題があります。良いリファレンスはWhy does delayed expansion fail when inside a piped block of code?です。私は質問とすべての答えを読むことをお勧めします。選択された回答は最高の情報を持っていますが、他の回答は文脈を提供するのに役立ちます。

EDIT 2015年6月2日私は最近、あなたがに頼ることなくきれいに、保存し、パイプのどちらか(あるいは両方)の側からERRORLEVELを取得するために、DOSKEYマクロを使用することができます発見した

一時ファイル。私はDosTipsユーザーEd Dyreenからhttp://www.dostips.com/forum/viewtopic.php?p=41409#p41409というアイデアを得ました。 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 

したい場合は、取得した後、あなたはERR「マクロ」の定義をクリアするために最後にもう一つのコマンドを追加することができます値。

doskey /exename=err err= 
+0

シンプルなソリューションは、ティー(同時出力)を使用する主な理由を打ち消します。また、最初の解決策では、 "set/p MY_ERROR =

+0

'' call set'、 '' call echo'などの処理は何ですか?私は前にこの構文を見たことがない。 – alecov

+1

@Alek - 最初の解析後に2回目の変数展開を行うのは古いハックです。遅延拡張を使用する代わりに使用できます。 'echo!var!'は 'call echo %% var %%'に似ています。通常は遅延拡張が好まれますが、CALLハックが必要な場合があります。 – dbenham

関連する問題