チャポケのブログ

勉強したことをまとめておく。

Windowsバッチ 引数変数(バッチパラメータ)

引数変数(バッチパラメータ)

バッチファイルを実行する際に、引数を渡すことができるが、
渡された引数は順番に%1, %2, %3, …, %9の変数として受け取ることができる。
%0には、バッチファイル名が格納される。

rem test1.bat
echo arg0: %0
echo arg1: %1
echo arg2: %2
echo arg3: %3
echo arg4: %4
> test1.bat aaa bbb ccc ddd
arg0: test1.bat
arg1: aaa
arg2: bbb
arg3: ccc
arg4: ddd

引数の区切り文字

バッチファイルの引数の区切り文字は、半角スペースだけではなく、次のようになっている。

  • (半角スペース)
  • ,(カンマ)
  • ;(セミコロン)
  • =(イコール)

従って、次のコマンドラインは、上の実行結果と変化しない。

> test1.bat aaa,bbb;ccc=ddd
arg0: test1.bat
arg1: aaa
arg2: bbb
arg3: ccc
arg4: ddd

区切り文字を含む文字列を引数として渡したい場合は、"(ダブルクォーテーション)で囲む。
次のコマンドラインは、上の実行結果から変化する。

> test1.bat "aaa,bbb;ccc=ddd"
arg0: test1.bat
arg1: "aaa,bbb;ccc=ddd"
arg2:
arg3:
arg4:

但し、この場合、"(ダブルクォーテーション)を含んだ文字列となるので注意。
これを避けるためには、引数の記述を %~n のようにする。

引数変数の解釈時変換

引数変数%nを次のようにすると、それぞれ変換された文字列を取得できる。
コマンドプロンプトで「call /?」を実行すると、これらについてのヘルプ情報を確認できる。

echo --------------------------
echo そのまま          1  : %1
echo 引用句 (") を削除 ~1 : %~1
echo 完全修飾パス名    ~f1: %~f1
echo ドライブ文字      ~d1: %~d1
echo パス              ~p1: %~p1
echo ファイル名        ~n1: %~n1
echo ファイル拡張子    ~x1: %~x1
echo 短い名前          ~s1: %~s1
echo ファイル属性      ~a1: %~a1
echo ファイル日付時刻  ~t1: %~t1
echo ファイルサイズ    ~z1: %~z1 (バイト)
echo --------------------------
echo ドライブ文字+パス
echo   ~dp1: %~dp1
echo ファイル名+ファイル拡張子
echo   ~nx1: %~nx1
echo ファイル属性+ファイル日付時刻+ファイルサイズ+完全修飾パス名
echo   ~ftza1: %~ftza1
echo --------------------------
--------------------------
そのまま          1  : a1.txt
引用句 (") を削除 ~1 : a1.txt
完全修飾パス名    ~f1: C:\test\a1.txt
ドライブ文字      ~d1: C:
パス              ~p1: \test\
ファイル名        ~n1: a1
ファイル拡張子    ~x1: .txt
短い名前          ~s1: C:\test\a1.txt
ファイル属性      ~a1: --a-----l--
ファイル日付時刻  ~t1: 2020/05/06 11:29
ファイルサイズ    ~z1: 24 (バイト)
--------------------------
ドライブ文字+パス
  ~dp1: C:\test\
ファイル名+ファイル拡張子
  ~nx1: a1.txt
ファイル属性+ファイル日付時刻+ファイルサイズ+完全修飾パス名
  ~ftza1: --a-----l-- 2020/05/06 11:29 24 C:\test\a1.txt
--------------------------

for %%a in (%*) do ()処理と、引数の数

引数変数をまとめた特殊な変数 %* を使ったfor文を使用すると、
引数変数を1つずつ取り出しながら繰り返し処理が可能
但し、この方法は%0からではなく、%1からなので、注意すること。
これを使うと、バッチファイルの引数の数をカウントできる。
また、引数変数を%1~%9で扱う場合は9個までしか対応できないが、
この方法なら、10個以上の引数変数も扱うことが可能となる。

rem hikisuu.bat
setlocal enabledelayedexpansion

set /A n = 0
for %%a in (%*) do (
  set /A n = !n! + 1
  set arg[!n!]=%%a
)

echo 引数の個数:%n%個
for /l %%m in (1, 1, %n%) do (
  echo arg%%m : !arg[%%m]!
)
> hikisuu.bat aaa bbb ccc
引数の個数:3個
arg1 : aaa
arg2 : bbb
arg3 : ccc