Windowsバッチファイル

バッチファイルの引数の受け取り方【%1〜%9・%*・shiftの使い方完全ガイド】

Windowsバッチファイル
記事内に広告が含まれています。

バッチファイルを汎用的に使えるようにするには「引数」が欠かせません。引数を使えば、同じバッチファイルを異なる値で動かせます。%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管理人

コメント

タイトルとURLをコピーしました