バッチ

変数 (variable)

set x=foo
echo %x%

バッチパラメータ (batch parameters) / コマンドライン引数

%0にはバッチのファイル名、%1~%9に最初の引数から順に格納されます。

引数は渡されない可能性があるため、

IF %1 == ABC echo ok

のようにすると、

IF  == ABC echo ok

のように展開され、「echo の使い方が誤っています。」としてエラーとなります。よって引用符で囲むのが安全です。

IF "%1" == "ABC" echo ok

引数が渡された場合のみ処理を実行

引数が空文字ではないことを確認します。

IF not [%1] == [] echo ok

このとき次のように引用符で囲むと、

IF not "%1" == "" echo ok

引数に引用符が含まれる場合に問題となるため、かっこで囲むようにします。windows - What is the proper way to test if variable is empty in a batch file? - Stack Overflow

修飾子

引数に修飾子を付加することで、下表のようにその内容を置換できます。

修飾子 説明
%~1 Expands %1 and removes any surrounding quotation marks ("").
%~f1 Expands %1 to a fully qualified path name.
%~d1 Expands %1 to a drive letter.
%~p1 Expands %1 to a path.
%~n1 Expands %1 to a file name.
%~x1 Expands %1 to a file extension.
%~s1 Expanded path contains short names only.
%~a1 Expands %1 to file attributes.
%~t1 Expands %1 to date and time of file.
%~z1 Expands %1 to size of file.
%~$PATH:1 Searches the directories listed in the PATH environment variable and expands %1 to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found, this modifier expands to the empty string.
修飾子 説明
%~dp1 Expands %1 to a drive letter and path.
%~nx1 Expands %1 to a file name and extension.
%~dp$PATH:1 Searches the directories listed in the PATH environment variable for %1 and expands to the drive letter and path of the first one found.
%~ftza1 Expands %1 to a dir-like output line.
Microsoft Windows XP - Using batch parameters

たとえばバッチファイルC:\dir\sample.batを実行すると、修飾子を付加した引数は下表のように取得できます。

引数 文字列
%0 "C:\dir\sample.bat"
%~0 C:\dir\sample.bat
%~d0 C:
%~p0 \dir\
%~dp0 C:\dir\
カレント ディレクトリ

バッチファイル内から他のファイルを参照する場合、相対パスで記述するとバッチファイルが実行される場所によってパスが異なってしまうため、%~dp0sample.txtのように実行された場所を基準とします。

forコマンド

バッチでforコマンドを用いるときには「%変数名」ではなく、「%」を重ねて「%%変数名」とします。

OSによる処理の分岐

すべてのOSで定義されている環境変数comspecを参照すれば、1つのバッチ ファイル内でOSごとに異なる処理を実行できます。

ラベル (label)

コメント (comments)

remコマンドで記述できます。

rem コメント1
rem コメント2
...

このときコマンド エコーが有効だとコメントも出力されてしまうため、それが不要ならば@remと記述します。

トラブル対処法

「・ソ」コマンド

'・ソ' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

として処理に失敗するときには、バッチファイルのエンコードをコードページの設定に合わせて変更します。なおこの「・ソ」とは、UTF-8のBOM「EFBBBF」を、Shift_JISと解釈したときの文字です。

コード 文字
EFBB
BF ソ

コマンドが認識されない

コマンドプロンプトからは認識されるのに、外部のアプリケーションからバッチファイルを実行したときに、コマンドが認識されないことがあります。

'***' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

この場合には、32ビット版のコマンドプロンプトが起動されていないか確認します。