4

バットスクリプトは次のとおりです。

@エコーオフ

REM サブプロセスの終了コードを取得する方法

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "usebackq tokens=* delims=" %%i IN (
    `^
        tracert google.com ^
        ^& EXIT /B 5 ^
    `
) 行う (
    エコー [ログ] %%i
)

REM ここで必要なのは "EXIT_CODE:5" ,
REM でも、「EXIT_CODE:0」と表示された、助けて!
レム
REM ***注***: 一時ファイルや非バット スタイルのサポートはありません。
REM 正確な方法は大歓迎です。ここではバットゾーンのみです。
レム
ECHO EXIT_CODE:%ERRORLEVEL%

エンドローカル

一時停止

サブプロセスの出力と終了コードの両方をキャプチャする必要があります。その後、for...inステートメントで出力を処理します。ただし、終了コードは通過しません。

サブプロセスが終了すると、ステートメントの終了後に終了コードがメインプロセスによってフラッシュされたかfor...in、最初に渡されなかった可能性があります。

4

3 に答える 3

4

FOR IN() 句内のコマンドは、まったく新しい CMD.EXE セッションで実行されるため、コマンドが設定する可能性のある ERRORLEVEL または環境変数に直接アクセスすることはできません。

通常、最善かつ最も簡単な解決策は、一時ファイルを使用することです。

yourCommand >output.txt
set exit_code=%errorlevel%
for /f "delims=" %%i in (output.txt) do processOutput
del output.txt

ただし、一時ファイルは使用できないと述べています。

唯一のオプションは、IN() 句内で ERRORLEVEL をエコーし​​、DO 句内で ERRORLEVEL を解析することです。%ERRORLEVEL% は解析時に展開され、IN() 句全体が一度に解析されるため、%ERRORLEVEL% は常に 0 になるため、ERRORLEVEL のエコーは少し注意が必要です。

IN() 句のコマンドは、バッチ コンテキストではなく、コマンド ライン コンテキストで実行されます。新しい CMD.EXE セッションは、現在の遅延拡張状態を継承しません。デフォルトでは、遅延拡張が無効になっています。最も簡単な解決策は、適切にエスケープされた CALL を使用して%ERRORLEVEL%、コマンドが実行されるまで展開を遅らせることです。コマンド コンテキストをエスケープするためにキャレットが追加されます。次に、パーセントとキャレットを 2 倍にして、親バッチ - をエスケープします%%^^ERRORLEVEL%%

DO 句で ERRORLEVEL と通常の出力を区別できるように、ERRORLEVEL メッセージを一意にする必要があります。

@echo off
setlocal enableDelayedExpansion
for /f "delims=" %%A in ('dir DoesNotExist^&call echo ::ERROR::%%^^ERRORLEVEL%%') do (
  set "ln=%%A"
  if "!ln:~0,9!" equ "::ERROR::" (
    set "EXIT_CODE=!LN:~9!"
  ) else (
    REM normal output - do whatever
    echo %%A
  )
)
echo EXIT_CODE=%EXIT_CODE%

上記の出力例を次に示します。

C:\test>test.bat
File Not Found
 Volume in drive C is OS
 Volume Serial Number is EE2C-5A11
 Directory of C:\test
EXIT_CODE=1
于 2012-10-11T12:11:33.523 に答える
1

プログラムの終了コードは、 を通じて読み取ることができます%ERRORLEVEL%。後で変数に割り当てるにはecho

set exitstatus=%ERRORLEVEL%
echo %exitstatus%

Raymond Chen によるこの記事は興味深いかもしれません。

于 2012-10-10T14:22:48.537 に答える
0

Mike Kwan がすでに言ったように、%errorlevel%変数を評価します。サブプロセスの終了コードを設定したいように見えるので、次のようにすることができます:

@echo off

call :trace google.com
echo EXIT_CODE:%errorlevel%

set text=
for /f "delims= tokens=*" %%l in (out.txt) do (
  set text=!text!^

%%l
)
echo !text!

goto end

:trace
tracert %1 >out.txt
exit /b 5

:end
pause

編集:出力を変数に読み込むコードで更新されました。

于 2012-10-10T22:31:59.110 に答える