「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †概要 †UNIX系OSのシェル・スクリプトに相当する。 詳細 †
実行方法 †
ヘルプ、サンプル †ヘルプ †コマンドそれぞれの構文については記述しません。 サンプル †サンプルや例が必要であれば、 site:microsoft.com バッチファイル for の様に検索すると多数見つかります。 勘所 †コマンドライン引数と変数 †引数の指定 †batファイルを呼び出すときに、引数を指定できます。 testbat.bat arg1 arg2 引数の取出 †batファイル内では、引数は %数字 で取り出します。 echo arg1 は %1 echo arg2 は %2 代入、表示、置換 †batファイル内で、引数を変数に代入したり、 (set 変数名=値) set a1=%1 echo a1 は %a1% echo 文字置き換え %a1:g=G% 引数の数 †%数字 は 1 から 9 まで使用できます。 :_nextparam echo %1 shift if NOT "%~1" == "" goto :_nextparam :_end batファイル名 †
変数と環境変数 †batファイルでは、%変数名% は、環境変数と共通です。
「"」の除去 †引数、変数 は、 " " で囲んだまま展開されます。 以下のa1.batファイルがある場合、 set a=%1abc 「a1 "ABC"」 と実行すると、以下の様に展開されて set a="ABC"abc set が実行され、変数a に代入されます。 「"」を処理するには、 %~1 の様に 「~」 をつけて 「"」 を取り去ります。 set a=%~1abc の様にすると、以下の様に展開されて set a=ABCabc 「"」を除去できます。 更に、 set a="%~1abc" の様にすると、以下の様に展開されて、 set a="ABCabc" 余分な「"」を取り去りつつ、全体を「"」で囲むことができます。 「"」の扱いは、例えば if文 でどう記述するか、どう展開されるか、に影響します。 batファイルが以下の場合、 if %1 == ABC ( echo ok ) 「a1 ABC」と起動すると ok ですが、 この場合、 if "%~1" == "ABC" ( echo ok ) の様にすると、 「a1 "ABC"」「a1 ABC」どちらでも ok になります。 csvファイルの読み取り †for文を使って、区切り文字(delims=)、カラム(tokens=) を指定して読み取ります。 下の batファイルは、csv の 2つめ 3つめ を echo します。 batファイル: †for_3.bat @setlocal @echo off set csv="%~dpn0.csv" for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c type %csv%') do ( echo %%b %%c if "%%a" == "%~1" ( echo 引数で指定されたパラメタは %%d です ) ) @endlocal 実行例: †for_3.bat 123 bbb ccc 33 44 234 456 引数で指定されたパラメタは 678 です for文に指定した %%a と tokens= に指定した数 に従って、 batファイルの変数は10個を超えると、shiftを使うなど、面倒が生じますが、 上の例での注意。
上の for文は、 ( )内に type コマンドを書きましたが、 for /F %%a in (for_3.csv) do ( echo %%a ) ファイル名にスペースを含む場合は " " で囲みたいところですが、 for /F %%a in ("c:\temp\data files\for_3.csv") do ( echo %%a ) 内部でコマンド実行 †複数行に渡って記述する。 †改行を入れてコマンドライン引数を複数の行に分けるには、 改行入りのパラメタを入力したい。 †LinuxのBashのEOF(ヒアドキュメント)は、WindowsのBATだと「()」で記述できる。 別のBATファイルを呼び出す。 †CALLを使用する。 CALL BATファイル名 引数1 引数2 ... 変数の遅延展開 †遅延展開 無効 †for文で、 @setlocal @echo off set csv="%~dpn0.csv" for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c type %csv%') do ( set /A var1=%%b + %%c echo %%b + %%c は %var1% ) @endlocal 実行例: †bbb + ccc は 33 + 44 は 234 + 456 は このbatファイルで、 echo の %var1% は、 遅延展開 有効 †以下のbatファイルの様に
@setlocal ENABLEDELAYEDEXPANSION @echo off set csv="%~dpn0.csv" for /F "tokens=1,2,3,4 delims=," %%a in ('cmd.exe /c type %csv%') do ( set /A var1=%%b + %%c echo %%b + %%c は !var1! ) @endlocal 実行例: †bbb + ccc は 0 33 + 44 は 77 234 + 456 は 690 遅延展開を有効にすると、!変数名! が現れた時点で値に置き換えられます。 終了コード †batファイルの終了コードは、exit コマンドと共に指定します。 exit /B コード ただし、
このbatファイルは、
debug方法 †batファイルの効果的なdebugツールはありません。
くらいしか方法がありません。 debugが終わったら、元に戻すのを忘れないでください。 以下の様に、debug用の echo を用意すると、戻す作業が少し簡単になるかもしれません。 @setlocal @echo off call :_debugprint 引数を確認: %1 %2 %3 for /F "delims=" %%a in ('dir "%~1"') ( echo %%a ) @endlocal goto :EOF :_debugprint @rem debugが終わったら、echo をコメントアウトする echo %* goto :EOF サンプル †約数を求める †batファイル: †yakusu.bat @setlocal @echo off if "%1" == "" ( goto :_end ) set a=%1 set /A b=%a% - 1 :_next if NOT %b% GEQ 1 goto :_end set /A c=%a% / %b% * %b% if %c% == %a% ( echo %b% ) set /A b=%b% -1 goto :_next :_end @endlocal goto :EOF 実行例: †yakusu.bat 32 16 8 4 2 1 以下の set /A は、割って掛けることで、割り切れる数値かを確認、をしています。 set /A c=%a% / %b% * %b% カレントディレクトリ以下の VC++中間ファイルを削除 †batファイル: †del-vc-obj.bat @setlocal @echo off call :_vcfiles @endlocal goto :EOF :_vcfiles for %%i in (*.obj *.pcb *.pch *.ncb *.pdb *.ilk *.idb) do echo "%cd%\%%i" && del "%cd%\%%i" for /D %%i in (*) do ( pushd "%%i" call :_vcfiles popd ) goto :EOF 実行例: †このbatファイルを実行すると、カレントディレクトリ以下のVC++の中間ファイルを全て削除します。 %cd% はCMDのカレントディレクトリを表す組み込みの変数です。 参考 †
知識ゼロからのwindowsバッチファイル超入門 †Qiita †
@IT †
Tags: :シェル, :インフラストラクチャ, :Windows |