set x=foo echo %x%
%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. |
たとえばバッチファイルC:\dir\sample.batを実行すると、修飾子を付加した引数は下表のように取得できます。
引数 | 文字列 |
---|---|
%0 | "C:\dir\sample.bat" |
%~0 | C:\dir\sample.bat |
%~d0 | C: |
%~p0 | \dir\ |
%~dp0 | C:\dir\ |
バッチファイル内から他のファイルを参照する場合、相対パスで記述するとバッチファイルが実行される場所によってパスが異なってしまうため、%~dp0sample.txt
のように実行された場所を基準とします。
バッチでforコマンドを用いるときには「%変数名」ではなく、「%」を重ねて「%%変数名」とします。
すべてのOSで定義されている環境変数comspecを参照すれば、1つのバッチ ファイル内でOSごとに異なる処理を実行できます。
remコマンドで記述できます。
rem コメント1 rem コメント2 ...
このときコマンド エコーが有効だとコメントも出力されてしまうため、それが不要ならば@rem
と記述します。
'・ソ' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
として処理に失敗するときには、バッチファイルのエンコードをコードページの設定に合わせて変更します。なおこの「・ソ」とは、UTF-8のBOM「EFBBBF」を、Shift_JISと解釈したときの文字です。
コード | 文字 |
---|---|
EFBB | ・ |
BF | ソ |
コマンドプロンプトからは認識されるのに、外部のアプリケーションからバッチファイルを実行したときに、コマンドが認識されないことがあります。
バッチ ファイルではパーセント記号 (%) で囲まれた文字列は変数として認識されるため、それをパーセント記号として認識させるにはエスケープして「%%」と記述します。
'***' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
この場合には、32ビット版のコマンドプロンプトが起動されていないか確認します。