5

次のコマンドを見てください: なぜ a の値が の直後に使用できないの&ですか?

C:\>set a=

C:\>set a=3&echo %a%
%a%

C:\>echo %a%
3

C:\>set a=3&echo %a%
3

しかし、私がするとき

C:\>set a=

C:\>set a=3&set

a=3 はリストされた変数に含まれています!

ここで学んだトリックのためにこれが必要です。出力がパイプされてもコマンドの終了コードを取得するには: Windows コマンド インタープリター: 最初のパイプされたコマンドの終了コードを取得する方法ですが 、make スクリプトで使用する必要があるため、すべてが1 行である必要があります。これは私がやろうとしていることです:

target:
    ($(command) & call echo %%^^errorlevel%% ^>$(exitcodefile)) 2>&1 | tee $(logfile) & set /p errorlevel_make=<$(exitcodefile) & exit /B %errorlevel_make%

ただし、errorlevel_make は常に空です (終了コードを含むファイルが存在し、正しい終了コードが含まれています)。

これはcmdのバグですか?私にできることはありますか?

4

3 に答える 3

0

jeb の素晴らしい回答に触発されて、コードを少し修正して、パイプの両側のエラーレベルを個別に取得できるようにしました。たとえば、バッチ ファイルに次のパイプがあります。

CD non_exisitng 2>&1 | FIND /V ""
ECHO Errorlevel @right: %errorlevel%

上記のエラーレベルは、パイプの右側のみを参照し、FIND コマンドが成功したか失敗したかを示します。ただし、両側のエラーレベルを取得できるようにするために、上記のコードを次のように変更できます。

(CD non_exisitng & CALL ECHO %%^^errorlevel%% >err) 2>&1 | FIND /V ""
ECHO Errorlevel @right: %errorlevel%
SET /P err=<err
ECHO Errorlevel @left: %err%

出力:

The system cannot find the path specified.
errorlevel @right: 0
errorlevel @left: 1

@OP:

これは少し遅れていることは承知していますが、他の人にとっては役立つかもしれません。jeb の外部バッチ ファイルの方法に加えて、元の問題もワンライナーで解決できます。

target:
    ($(command) & call echo %%^^errorlevel%% >$(exitcodefile)) 2>&1 | tee $(logfile) & set /p errorlevel_make=<$(exitcodefile)  & cmd /c call exit /B %%errorlevel_make%%
于 2014-11-27T17:58:18.057 に答える