コマンドの実行結果としての戻り値(終了コード)は「ERRORLEVEL」環境変数に格納されます。
「ERRORLEVEL」を調べることで、直前のコマンド実行結果状態を取得できます。
net user stuser pass1234 /add if not %ERRORLEVEL% == 0 ( echo ERROR: Failed to create user: stuser exit /b 1 ) exit /b 0
コマンド実行による出力を変数に格納するためには、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 )
コマンド実行結果の成否や出力情報を解析する場合には、変数に格納せずに一時ファイルに書き出してしまう方法が有効です。
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