バッチファイルを汎用的に使えるようにするには「引数」が欠かせません。引数を使えば、同じバッチファイルを異なる値で動かせます。%1〜%9・%*・shift の使い方を実例とともに解説します。
引数とは何か?
バッチファイルを実行するとき、後ろに値を渡すことができます。これを「引数(ひきすう)」といいます。例えば backup.bat C:\work D:\backup と実行したとき、C:\work が第1引数、D:\backup が第2引数です。
rem backup.bat を以下のように実行した場合:
rem backup.bat C:\work D:\backup
@echo off
rem %1 = C:\work(第1引数)
rem %2 = D:\backup(第2引数)
rem %0 = backup.bat(バッチファイル自身の名前)
echo コピー元: %1
echo コピー先: %2
robocopy %1 %2 /E引数の入力チェック(必須チェック)
引数が渡されなかった場合のエラー処理は必ず実装しましょう。
@echo off
rem 引数が渡されていない場合はエラーメッセージを表示して終了
if "%1"=="" (
echo エラー: 引数が指定されていません
echo 使い方: %~nx0 コピー元フォルダ コピー先フォルダ
echo 例: %~nx0 C:\work D:\backup
pause
exit /b 1
)
if "%2"=="" (
echo エラー: コピー先フォルダが指定されていません
exit /b 1
)
echo コピー元: %1
echo コピー先: %2
robocopy "%~1" "%~2" /E
rem %~nx0 = バッチファイル自身のファイル名(拡張子付き)
rem %~1 = 引数のクォートを除去したもの(パスの処理に使う)%~1 〜 %~9 の修飾子(クォート除去・フルパス化)
| 書き方 | 意味 | 例(引数が “C:\My Work” の場合) |
|---|---|---|
| %1 | 引数そのまま(クォート含む) | “C:\My Work” |
| %~1 | クォートを除去 | C:\My Work |
| %~f1 | フルパスに展開 | C:\My Work |
| %~n1 | ファイル名のみ(拡張子なし) | My Work |
| %~x1 | 拡張子のみ | (フォルダなら空) |
| %~d1 | ドライブ文字のみ | C: |
| %~p1 | パス部分のみ | \My Work\ |
%* ― すべての引数をまとめて受け取る
@echo off
rem %* = 渡されたすべての引数(スペース区切りで連結)
rem 引数をすべて表示
echo すべての引数: %*
rem 引数をコマンドにそのまま渡す
robocopy %*shift ― 引数をずらして9個以上の引数を処理する
shift コマンドを使うと引数の番号を1つずつずらせます。%1〜%9 の9個を超える引数を処理したいときや、ループで引数を順番に処理したいときに使います。
@echo off
rem 引数がなくなるまでループ処理
:LOOP
if "%1"=="" goto :END
echo 処理中: %1
shift ← %1を削除して%2を%1に、%3を%2に...とずらす
goto :LOOP
:END
echo すべての引数を処理しました
pauseまとめ
- %1〜%9 でバッチファイルに渡された引数を参照できる(%0はバッチファイル自身)
- 引数を受け取るときは if “%1″==”” で必ず入力チェックをする
- %~1 でクォートを除去してパスを安全に処理できる
- %~nx0 でバッチファイル自身のファイル名を取得できる(使い方の表示に便利)
- shift で引数を順番にずらしてループ処理できる
引数にスペースを含むパスを渡すとき、%1 ではなく %~1 を使わないとパスが途中で切れるバグに悩まされます。パスを扱う引数には常に %~1 を使う習慣をつけましょう。
hobbyshift管理人



コメント