Windows バッチファイル

インデックス
SETLOCAL / ENDLOCAL
コード
@ECHO OFF ECHO ------------------------ begin SET A=Hello ECHO *101: A=%A%
ECHO ---------------------------- SETLOCAL SETLOCAL ECHO *201: A=%A% SET A=World ECHO *202: A=%A% ENDLOCAL ECHO ---------------------------- ENDLOCAL
ECHO *102: A=%A% ECHO ------------------------ end
結果
------------------------ begin *101: A=Hello ---------------------------- SETLOCAL *201: A=Hello *202: A=World ---------------------------- ENDLOCAL *102: A=Hello ------------------------ end
サブルーチン(SETLOCAL / ENDLOCAL)
コード
@ECHO OFF SET PM1=AAA SET PM2=BBB ECHO PM1=%PM1% ECHO PM2=%PM2% REM サブルーチン SUB_PROCESS を呼び出します REM 引数を 2 つ XXXX, YYYY 渡しています CALL :SUB_PROCESS XXX YYY REM サブルーチン SUB_PROCESS の終了コード表示します ECHO RC=%ERRORLEVEL% ECHO PM1=%PM1% ECHO PM2=%PM2% REM バッチファイルの処理を終了します EXIT /B
:SUB_PROCESS ECHO ------------------------ begin SETLOCAL REM 引数を取得 SET PM1=%1 SET PM2=%2 ECHO PM1=%PM1% ECHO PM2=%PM2% ENDLOCAL ECHO ------------------------ end REM 呼び出し元へ戻ります REM 終了値を 72 に設定します EXIT /B 72
結果
PM1=AAA PM2=BBB ------------------------ begin PM1=XXX PM2=YYY ------------------------ end RC=73 PM1=AAA PM2=BBB
FOR 文(その 01: /L)
コード
@ECHO OFF REM C/C++, Java, JavaScript 等の for 文と同様な繰り返し。 REM %%I は添え字 REM 開始値,ステップ値,終了値 REM 注意)変数に添え字の値を代入しても一致しません FOR /L %%I IN (1, 3, 8) DO ( SET A=%%I ECHO %%I : %A% , !A! )
結果
1 : 7 , !A! 4 : 7 , !A! 7 : 7 , !A!
FOR 文(その 02: /L), SETLOCAL (ENABLEDELAYEDEXPANSION) / ENDLOCAL 文
コード
@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR /L %%I IN (1, 3, 8) DO ( SET A=%%I ECHO %%I : %A% , !A! ) ENDLOCAL
結果
1 : 7 , 1 4 : 7 , 4 7 : 7 , 7
GUI プロセスの実行(.EXE ファイル等の実行)
コード
@ECHO OFF REM 同期実行:プロセスを指定する ECHO 起動: 1 notepad ECHO 終了しました: 1 REM 非同期実行:START コマンドの使用(/WAIT スイッチなし) ECHO 起動: 2 START notepad ECHO 起動完了: 2 REM 同期実行:START コマンドの使用(/WAIT スイッチあり) ECHO 起動: 3 START /WAIT notepad ECHO 終了しました: 3
結果
起動: 1 終了しました: 1 起動: 2 起動完了: 2 起動: 3 終了しました: 3
フォルダ削除
コード:バッチファイル
rem フォルダ内が空の時の削除 rmdir D:\tmp rem フォルダ内が空でない時の削除(/s を付ける) rmdir /s D:\tmp rem フォルダ内に読取専用のものが rem 含まれている時(/q を付ける) rmdir /q D:\tmp rem フォルダが読取専用で空の時(/s /q を付ける) rmdir /s /q D:\tmp
コード:PowerShell
# フォルダ内が空の時に削除 Remove-Item D:\tmp # フォルダ内が空でない時の削除(-Recurse を付ける) Remove-Item D:\tmp -Recurse # フォルダ内に読取専用のものが # 含まれる時(-Force を付ける) Remove-Item D:\tmp -Force
フォルダ内を削除
コード:バッチファイル
@echo off setlocal enabledelayedexpansion set pm1=%1 set pmPath=%pm1%\* if "" neq %pm1% (     if exist %pm1% (         rem del /q %pmPath%             echo %pmPath%         rem for /d %%i in (%pmPath%) do rd /s /q %%i             for /d %%i in (%pmPath%) do echo %%i     ) ) endlocal exit /b 0
フォルダ内を削除(サブ・フォルダは残す)
コード:バッチファイル
@echo off setlocal enabledelayedexpansion set pmPath=%1 if "" neq %pmPath% (     if exist %pmPath% (         rem for /r %pmPath% %%i in (*) do del %%i             for /r %pmPath% %%i in (*) do echo %%i     ) ) endlocal exit /b 0
ツール ファイル名を変更してコピー
コード
@echo off rem コピー先のフォルダ・パス(最後に \ を付ける) set dstpath=D:\tmp\ if "%~f1"=="" goto :fin rem コピー後のファイル名は、 rem タイトルと拡張子の間に「_参照」を入れる set dstpath1=%dstpath%%~n1_参照%~x1 if not exist "%dstpath1%" goto :run set /p answer=上書きしますか?(Yes/No): if "%answer%"=="Y" goto :run if "%answer%"=="y" goto :run goto :fin :run copy /y "%~f1" "%dstpath1%" start notepad "%dstpath1%" :fin
バッチファイル・テンプレート
@echo off pushd "%~dp0" setlocal enabledelayedexpansion rem 以下に実行するコマンドを記す echo Hello, world. endlocal popd pause
実行エビデンス用バッチファイル・テンプレート
@echo off pushd "%~dp0" setlocal enabledelayedexpansion @echo on call :do > .\%~n0.log @echo off endlocal popd pause exit /b %do_exit% :do @echo ---- 開始日時 ---- %date% %time% @rem 以下に実行するコマンドを記す echo Hello, world. @set do_exit=%errorlevel% @echo. @echo ---- 終了日時 ---- %date% %time% @exit /b 0