バッチファイルの引数取得・渡し方!%1やshiftの使い方

バッチファイルの引数取得・渡し方!%1やshiftの使い方

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:3,390

Windowsのバッチファイルでコマンドライン引数を受け取り活用する方法を徹底解説。%1〜%9の基本変数、10番目以降の引数を処理するshiftコマンド、引数の有無を判定するテクニックなど、実務の業務効率化に役立つワザをわかりやすく紹介します。

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

ベストセラー

世界一流エンジニアの思考法

難易度
実用性
思考法

技術スキル以上に大切な「考え方」をアップデートできる。世界基準の効率的な仕事術が学べます。

文系社会人のためのIT資格の歩き方: 文系のあなたに最適な道をご提案します (YKcreate kiki)

難易度
実用性
キャリア度

ロードマップが非常に明確。キャリアプランを見据えた、無駄のない学習順序を提案してくれます。

エンジニアを説明上手にする本 相手に応じた技術情報や知識の伝え方

難易度
実用性
コミュ力

「伝える技術」もエンジニアの重要なスキル。相手の視点に立った、具体的な説明のコツが満載です。

技術広報入門 ー テックブログから始めるエンジニアカルチャーのつくり方

難易度
実用性
独自性

テックブログを入口にエンジニア組織の文化をどう設計し、育てていくかという実践論が学べます。

「毎回違うファイル名を処理したいのに、バッチファイルに直接パスが書き込まれていて不便…」 「コマンドラインから値を渡して、バッチファイルの動作を動的に切り替えたいけれど、引数の受け取り方がよくわからない」

Windowsのバッチファイルを使って日々の業務を自動化していると、このような悩みや壁にぶつかることはありませんか?固定値の処理だけでは、応用が利かず作業効率も半減してしまいます。

この記事を読むと、バッチファイルで外部から引数を受け取り、自由自在に処理を分岐・実行できるようになります。基本の位置変数から、10番目以降の引数を処理するテクニック、ファイルパスの高度な操作までマスターして、業務自動化のレベルを一段引き上げましょう。

バッチファイルの引数とは?基本の仕組み

バッチファイルの「引数(ひきすう)」とは、コマンドプロンプトやショートカットからバッチファイルを実行する際、外部から渡す追加のデータのことです。

例えば、バックアップ用のバッチファイルを作る際、処理対象のフォルダパスを毎回コードに直接書き換えるのは非効率です。引数を使用すれば、実行時に backup.bat C:\Data のように渡すだけで、バッチ側が C:\Data という値を受け取って処理を行えるようになります。

位置変数(%1〜%9)の使い方

バッチファイルでは、実行時に渡された引数を順番に格納するための特別な変数があらかじめ用意されています。これらを位置変数と呼びます。

  • %0: 実行されたバッチファイル自身
  • %1: 1番目の引数
  • %2: 2番目の引数
  • %3: 3番目の引数
  • …
  • %9: 9番目の引数

実行時の引数指定の基本構文

実際に引数を受け取る簡単なバッチファイルを作成してみましょう。

ステップ1: サンプルバッチファイルの作成 メモ帳などを開き、以下のコードを記述して test.bat という名前で保存します。

Terminal window
@echo off
echo 実行ファイル名: %0
echo 1番目の引数: %1
echo 2番目の引数: %2
pause

ステップ2: コマンドプロンプトからの実行 コマンドプロンプトを開き、保存したフォルダに移動してから以下のように引数を指定して実行します。

Terminal window
test.bat Apple Orange

実行結果の出力例:

実行ファイル名: test.bat
1番目の引数: Apple
2番目の引数: Orange
続行するには何かキーを押してください . . .

このように、スペース区切りで渡した値が、自動的に %1 や %2 に割り当てられる仕組みになっています。

補足: 引数にスペースが含まれる場合(例: C:\My Folder\test.txt)は、値全体をダブルクォーテーションで囲んで test.bat "C:\My Folder\test.txt" のように指定する必要があります。

10番目以降の引数や可変長引数を処理する方法(shiftコマンド)

前述の通り、コマンドライン引数を直接参照できるバッチパラメーターは %1 から %9 までです。それでは、10個以上の引数を渡したい場合や、渡される引数の数が変動する(可変長)場合はどうすればよいのでしょうか。

ここで活躍するのが shift コマンドです。

shiftコマンドの基本動作

shift コマンドを実行すると、%0~%9 のバッチパラメーターの値が1つずつ左にシフト(ずれる)します。

  • 実行前: %0 = “test.bat”, %1 = “A”, %2 = “B”, %3 = “C” …
  • shift 実行後: %0 = “A”, %1 = “B”, %2 = “C” … (元の %1 が %0 に、%2 が %1 に繰り上がる)

通常、可変長の引数を処理する場合は %1 を順番に参照するため、%0 の変化を意識する必要はありません。

この動作を利用することで、10番目以降の引数(%10 という書き方はできません)も、常に %1 を参照しながら順次処理していくことが可能になります。

ループ処理で全引数を順次取得するサンプルコード

複数のファイルを一括処理したい場合などに便利な、すべての引数を順番に処理するサンプルコードです。

Terminal window
@echo off
echo === 引数の順次処理を開始します ===
:loop
if "%~1"=="" goto end
echo 現在の処理対象: %~1
shift
goto loop
:end
echo === すべての処理が終了しました ===
pause

解説:

  1. :loop ラベルでループの起点を作ります。
  2. if "%~1"=="" goto end で、引数がなくなったら(空になったら)ループを抜けるように判定しています。
  3. %~1 の内容を表示した後、shift コマンドで次の引数を %1 の位置に繰り上げます。
  4. goto loop で再度先頭に戻り、引数がなくなるまで繰り返します。

実行時に test.bat file1.txt file2.txt file3.txt のように複数の引数を渡すと、1つずつ順番に処理されることが確認できます。

補足:すべての引数をまとめて取得する %*

個別に処理するのではなく、「渡されたすべての引数をまとめて取得したい」場合は、特殊パラメーターの %* を使用します。

Terminal window
@echo off
echo すべての引数:
echo %*
pause

これを test.bat Apple Orange Banana と実行すると、そのまま Apple Orange Banana と出力されます。引数全体を別のコマンドにそのまま渡したい場合などに大変便利です。

引数の有無や未指定をチェック・判定する方法

実務でバッチファイルを作成する際、ユーザーが引数を指定し忘れたまま実行してしまうケースがよくあります。エラーを防ぐために、引数が正しく渡されているかをチェックする仕組みが不可欠です。

「if “%1”==""」を使った空チェック

バッチファイルの先頭で %1 が空(未指定)かどうかを判定し、空であれば使い方を表示して処理を中断するテクニックが一般的です。

Terminal window
@echo off
rem 1番目の引数が空かどうかをチェック
if "%~1"=="" (
echo 【エラー】引数にフォルダパスを指定してください。
echo 使用方法: %0 ^<フォルダパス^>
exit /b 1
)
echo 指定されたフォルダ: %1
rem 以降に実際の処理を記述

注意点: if "%~1"=="" のように、%~1(拡張記法)を使って引数からダブルクォーテーションを一旦取り除いた上で、再度ダブルクォーテーションで囲んで比較するのが実務上のポイントです。引数にスペースを含むパス(例: "C:\My Folder")が渡された際に ""C:\My Folder""=="" と展開されて構文エラーになるのを防ぐためです。

デフォルト値を設定する実践テクニック

「引数が指定された場合はその値を使用し、省略された場合はデフォルト値(初期値)を適用する」という柔軟な処理も簡単に行えます。

Terminal window
@echo off
set "TARGET_DIR=%~1"
rem 引数が空の場合はデフォルト値を代入
if "%TARGET_DIR%"=="" (
set "TARGET_DIR=C:\DefaultFolder"
echo 引数が未指定のため、デフォルトのフォルダを使用します。
)
echo 処理対象: %TARGET_DIR%
pause

この方法を使えば、引数を省略して実行してもエラーにならず、安全にデフォルト動作させることができます。

引数の拡張記法(%~dp1など)でファイルパスを操作する

バッチファイルにファイルパスの引数(%1 など)を渡すとき、ファイル名だけを取り出したい、あるいはドライブ名だけを知りたいという場合があります。 Windowsのバッチファイルには、引数に対して強力な拡張記法が用意されています。

ドライブ名やファイル名だけを抽出する便利構文

%1 などの位置変数に対し、チルダ(~)と特定のアルファベットを組み合わせることで、パスの特定部分だけを抽出できます。

拡張記法抽出される内容(例: C:\Work\sample.txt の場合)
%~1ダブルクォーテーションを取り除いたパス (C:\Work\sample.txt)
%~f1フルパス (C:\Work\sample.txt)
%~d1ドライブ名 (C:)
%~p1パス名 (\Work\)
%~n1ファイル名(拡張子なし) (sample)
%~x1拡張子 (.txt)
%~dp1ドライブ名とパス名 (C:\Work\)
%~nx1ファイル名と拡張子 (sample.txt)

サンプルコード:

Terminal window
@echo off
if "%~1"=="" (
echo ファイルパスを引数に指定してください。
exit /b 1
)
echo 渡されたフルパス: %1
echo -----------------------------------
echo 1. 引用符除去: %~1
echo 2. ドライブ名: %~d1
echo 3. フォルダパス: %~p1
echo 4. ファイル名: %~n1
echo 5. 拡張子: %~x1
echo 6. ディレクトリ: %~dp1
echo 7. ファイル名+: %~nx1
pause

この拡張記法をマスターすると、渡されたファイル名をもとに「同じフォルダ内に別名の出力ファイルを生成する」といった高度なファイル操作バッチが非常に簡単に作れるようになります。

まとめ:バッチファイルの引数をマスターして自動化を高度化しよう

今回は、Windowsのバッチファイルで引数を受け取り、活用するための基本から応用テクニックまでを解説しました。

記事のポイントを振り返ってみましょう。

  • **基本の位置変数(%1〜%9)**を使うことで、実行時に外部からデータを渡せる。
  • shift コマンドを活用すれば、10個以上や可変長の引数にも対応できる。
  • **空チェック(if "%~1"=="")**を実装することで、引数の未指定によるエラーを未然に防げる。
  • **引数の拡張記法(%~dp1 や %~nx1 など)**を使うと、ファイルパスからドライブ名やファイル名などを自在に抽出できる。

バッチファイルの引数を使いこなすことで、固定化されていたスクリプトが一気に汎用的なツールへと生まれ変わります。日々の業務効率化や自動化の精度を上げるために、ぜひご自身の環境でも試してみてください。


以上で本記事の解説を終わります。
よいITライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

ITエンジニアにお勧めの本 ↗

おすすめ

エンジニアが知っておきたい思考の整理術 複雑な情報を【理解する】【伝える】テクニック

難易度
実用性
図解

思考の整理というテーマを、実務ですぐに使える具体的な「技術」として落とし込んだ一冊です。

人気記事


記事を評価

Thanks!
目次
Scroll to Top