【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう

本記事では Windows 上で利用可能なバッチファイルの引数の利用方法について、基本的な引数参照の方法、Shift コマンドを使った引数参照の方法、For コマンドを使った引数参照の方法について紹介し、合わせて引数参照で利用可能な修飾子の記述方法を紹介しています。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう
しらかば堂

いつも記事を読んで頂きありがとうございます~
今日の調子はいかがですか?

基本的な引数参照

バッチファイルを起動した際に引数を指定するとこのバッチファイルの中で指定した引数を参照することができます。

具体的には

  • コマンドラインから引数付きでバッチファイルを起動した場合
  • 1つ以上のファイルをバッチファイル、あるいはそのショートカットにドラッグ&ドロップしてバッチファイルを起動した場合

 %0 から %9 をバッチパラメータの拡張変数として利用できます。

つまり %0 は起動したバッチファイル名に置き換えられ、%1 から %9 は、コマンドラインで指定された引数、あるいはドラッグ&ドロップされたファイル名に置き換えられます。

また%* を %0 を除く全ての引数リストを表すワイルドカード表現%% は 「%」 という文字そのものを表すエスケープ表現として利用できます。

それでは人気のエディタ Terapad 等を利用して次のようなバッチファイルを作成し

@echo off
echo %%0: %0
echo %%1: %1
echo %%2: %2
echo %%3: %3
echo %%4: %4
echo %%5: %5
echo %%6: %6
echo %%7: %7
echo %%8: %8
echo %%9: %9
echo %%10: %10
echo %%11: %11
pause


これを

  • %USERPROFILE%\Tools\bat\バッチファイルの引数を確認する.bat

に保存したあと、PC内の適当なファイルをこのバッチファイルに ドラッグ&ドロップ して確認してみましょう。

ここでは自身のPC環境下で 記事 

【Windows環境設定】VBScript とバッチファイルを利用しNASをネットワークドライブに組み込む

でマウントしたネットワークドライブ Z: 配下の

  • Z:\mp4\youtube

配下にある 10個以上の mp4 ファイルを上の バッチファイルにまとめてドロップしてみた結果です。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう


この結果をみると確かに %0 でバッチファイル名が、%1 から %9 で正しく ドラッグ&ドロップしたファイル名が参照できているようです。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう
しらかば堂

ただし
%10%1 と “0” の文字連結
%11%1 と “1” の文字連結
なので期待した結果ではありません。
では %9 を超える引数へのアクセスはできないのでしょうか。

この記事が前提としているツールのフォルダ環境について興味を持たれた方は必要に応じて次の記事もご覧ください。
【Windows業務効率化】バッチファイルでツールのフォルダ環境を自動生成しよう

Shift コマンドを使った引数参照

実は %9 を超える引数へのアクセスは Shift コマンドを併用することで行うことが可能です。

この Shift コマンドは指定した引数を1つ番号の小さい方へずらすコマンドで、10個以上の引数を指定していて10番目以降の引数を参照するとき必要な数だけ Shift コマンドを繰り返します。

ここで確認のために先ほどのバッチファイルにエディタ Terapad 等で次のように Shift コマンドを追加し

@echo off
shift
echo %%0: %0
echo %%1: %1
echo %%2: %2
echo %%3: %3
echo %%4: %4
echo %%5: %5
echo %%6: %6
echo %%7: %7
echo %%8: %8
echo %%9: %9
echo %%10: %10
echo %%11: %11
pause


これを

  • %USERPROFILE%\Tools\bat\バッチファイルの引数をシフトする.bat

に保存しておきましょう。

そして先ほどと同じネットワークドライブ  Z: の

  • Z:\mp4\youtube

配下の 10個以上の mp4 ファイルを上の バッチファイルにまとめてドロップすると次のようになります。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう


どうでしょう。

先ほどのバッチファイルと比べ表示される引数が前に1つシフトし、先ほど参照できなかった

  • Z:\mp4\yotube\access_vba_04_01.mp4

が %9 として参照できていることが確認できるでしょうか。

また %0 も起動したバッチファイル名ではなく ドラッグ&ドロップ した最初のファイル名になっています。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう
しらかば堂

ただやっぱり少し分かりにくいですね
沢山のファイルを引数として指定するとき
もう少しスマートに引数の指定ができないでしょうか

For コマンドを使った引数参照

続いて以下のバッチファイルを同じようにエディタ Terapad 等で作成し

@echo off
setlocal enabledelayedexpansion
set cnt=1
for %%n in (%*) do (
echo %%!cnt! : %%n
set /a cnt=cnt + 1
)
pause

このファイルを

  • %USERPROFILE%\Tools\bat\バッチファイルの引数をFOR文で確認する.bat

に保存しておきます。

そして先ほど同様ネットワークドライブ  Z:の

  • Z:\mp4\youtube

配下に保存された20個以上の mp4 ファイルを上の バッチファイルにまとめてドロップすると次のようになりました。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう

いい感じで 10個以上のファイル名が引数で渡されていますね。

実は先ほどの バッチファイルは引数を参照するだけの目的であれば

@echo off
For %%n in (%*) do (
echo %%n
)
pause


で充分です。

ここで利用している For コマンドは %* (%0 を除く全ての引数リストを表すワイルドカード)から引数をひとつづつ順番に取り出しこの For コマンドの do( ) で囲まれたブロック中でのみ有効な変数 %%n に設定し、この変数をこのブロックの中で参照して利用します。

そして全ての入力引数を取り出し終わったときこの繰り返し処理を終了します。

この For コマンドの do( ) で囲まれたブロック中で利用可能な変数名は  %%a ~ %%z (つまり %% と1つの英文字) という決まりがありそれ以外は使えません(大文字小文字は区別されます)。

またここではファイル数のカウントを echo コマンドで表示するため %%!cnt! (「%」という文字と遅延環境変数(注) !cnt!) を利用しています。

(注) バッチファイル中の For 文のような () で囲まれたコードブロックの中で変数を再評価したいときに事前に、 setlocal enabledelayedexpansion を記述し遅延環境変数 を有効化すると再評価したい変数を !変数名! で参照することが可能になります。

逆に言えば、通常のバッチファイル内の %変数名% はこのバッチファイルが実行のために読み込まれたときに一度だけ評価されるだけなので、 () で囲まれたコードブロックの中で再評価はできません。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう
しらかば堂

また バッチファイルにはパラメータ数を直接的に表現する記述法はありませんが、For 文を使って以下のようなバッチファイルを作成すると %argc% でパラメータ数を求めることができることも知っておきましょう。
この set /A argc+=1 という書き方の意味については必要に応じて以下の記事も参照してください。

@echo off

set argc=0
for %%x in (%*) do (
set /A argc+=1
)

echo %argc%

if not %argc% == 2 (
echo 実行例:
echo start.bat ファイルのフルパス  true
echo start.bat ファイルのフルパス false
goto end
)

REM 実際の処理をここに記載します。

:end
REM バッチファイルを終了します
pause
【Windows業務効率化】バッチファイルのSet /A コマンドをマスターしよう: 変数設定と算術/代入演算の完全ガイド

引数参照で利用可能な修飾子

さて今度は引数の修飾子について紹介します。
バッチファイルの引数に修飾子を組み合わせると引数を部分的に抽出することができます。

次の表に、Windows 10 のコマンドラインの中で利用可能な修飾子を示します。

修飾子 説明
%〜1 %1を展開し、周囲の引用符( “”)を削除します。
%〜f1 %1を完全修飾パス名に展開します。
%〜d1 %1をドライブ文字に展開します。
%〜p1 %1をパスに展開します。
%〜n1 %1をファイル名に展開します。
%~x1 %1をファイル拡張子に展開します。

それでは以下のバッチファイルを同じようにエディタ Terapad 等で作成し

@echo off
echo -----------------------------------------------
echo %1そのもの
echo %1
echo -----------------------------------------------
echo %1を展開し、周囲の引用符("")を削除します。
echo %~1
echo -----------------------------------------------
echo %1を完全修飾パス名に展開します。
echo %~f1
echo -----------------------------------------------
echo %1をドライブ文字に展開します。
echo %~d1
echo -----------------------------------------------
echo %1をパスに展開します。
echo %~p1
echo -----------------------------------------------
echo %1をファイル名に展開します。
echo %~n1
echo -----------------------------------------------
echo %1をファイル拡張子に展開します。
echo %~x1
echo -----------------------------------------------
pause


このファイルを

  • %USERPROFILE%\Tools\bat\バッチファイルの引数の修飾子を確認する.bat

に保存しましょう。

そしてコマンドラインから先ほどから紹介しているエディタ Terapad のインストール先のフォルダ内にあったテキストファイル

  • C:\Program Files (x86)\TeraPad\Readme.txt

を引数として実行すると以下のようになります。

【Windows業務効率化】バッチファイルの引数、Shiftコマンド、Forコマンド、修飾子を知ろう


この修飾子があるとバッチファイルの中でファイル操作を行うコマンドと組み合わせていろいろなことができそうですね。

このバッチファイルの修飾子についての詳細な情報は、本記事の出典元となっている 以下の Microsoft の公式ドキュメントUsing batch parametersを参照ください。Windows 10 のみではなく Windows Server 等で利用可能な修飾子を確認できます。

まとめ

本記事では Windows 上で利用可能なバッチファイルの引数 の使い方を

  • 基本的な引数参照
  • Shift コマンドを使った引数参照
  • For コマンドを使った引数参照
  • 引数参照で利用可能な修飾子

といった観点でで紹介しました。

この記事が少しでも皆さんのバッチファイルへの理解の助けになれば幸いです。

【特集】自動化ツールをバッチファイルで統合し 作業をワンクリックで終わらせよう