Windowsバッチファイル実行結果の取得

Windowsバッチファイルでコマンド戻り値(終了コード)の取得

コマンドの実行結果としての戻り値(終了コード)は「ERRORLEVEL」環境変数に格納されます。

「ERRORLEVEL」を調べることで、直前のコマンド実行結果状態を取得できます。


 net user stuser pass1234 /add
 if not %ERRORLEVEL% == 0 (
   echo ERROR: Failed to create user: stuser
   exit /b 1
 )
exit /b 0

Windowsバッチファイルでコマンド実行結果を変数に格納する

コマンド実行による出力を変数に格納するためには、for文を用います。

for文に「usebackq」オプションを指定して、INで指定するコマンドにバッククォーテーションでくくります。


@echo off
setlocal

REM ホスト名を取得する
set CMD=hostname
set HOSTNAME=
for /f "usebackq delims=" %%a in (`%CMD%`) do set HOSTNAME=%%a
echo %HOSTNAME%

endlocal
exit /b 0

複数行の出力結果から特定の文字列を取得するには、for文によるループ処理を用います。

コマンド実行出力は一行単位でfor文内の変数に格納されていきますので、対応するキーワードから解析していきます。


@echo off
setlocal

REM winlogonのプロセスIDを取得する
set CMD=tasklist
for /f "usebackq tokens=1,2,3*" %%a in (`%CMD%`) do (
    if "winlogon.exe" == "%%a" (
        set /a WL_PID=%%b
    )
)

endlocal
exit /b 0

変数に特定の文字列が含まれているか確認する方法として、findコマンドが利用できます。


echo %BUFFER% | find %STR% > nul
if %ERRORLEVEL% equ 1 (
    echo Not found %STR%
    exit /b 1
)

Windowsバッチファイルでコマンド実行結果を解析する

コマンド実行結果の成否や出力情報を解析する場合には、変数に格納せずに一時ファイルに書き出してしまう方法が有効です。

for文を多用してしまうとスクリプトが読みにくくなりますので、IO処理時間を無視できる状況ならば、一時ファイルに書き出してから解析したほうが簡潔にスクリプトを記述できます。

ファイル中に文字列が存在するかどうかはfindコマンドやfindstrコマンドなどを利用できます。


@echo off
setlocal

REM 一時ファイルのパス作成
set EXEC_DATE=%date:~-10,4%%date:~-5,2%%date:~-2,2%
set EXEC_TIME=%time: =0%
set EXEC_TIME=%EXEC_TIME:~0,2%%EXEC_TIME:~3,2%%EXEC_TIME:~6,2%
set TMP_FILE=%~dp0tmp_%EXEC_DATE%%EXEC_TIME%.log

REM ライセンス確認コマンドを実行する
set SLMGR_BIN="%windir%\system32\slmgr.vbs"
cscript %SLMGR_BIN% -dlv > %TMP_FILE%

REM ライセンス認証に成功されているか確認する
find /i "ライセンスされています" %TMP_FILE% > nul
if not %ERRORLEVEL% equ 0 (
    echo ERROR: No License
    if exist %TMP_FILE% ( del %TMP_FILE% )
    exit /b 1
)

if exist %TMP_FILE% ( del %TMP_FILE% )
endlocal
exit /b 0


関連ページ