くろねこ自由気ままな日記

趣味の話題や忘備録(的な)情報のページ

ブログランキング・にほんブログ村へ

第4回 バッチ特集 ~引数~


おはようございます。くろねこです。

バッチ特集」も今回で第4回となりました。

今回の記事は、引数についてです。

バッチを利用するうえで、引数の理解は、ほぼ間違いなく必須要件ですので理解を深めていただければと思います。

 

【ご注意】
本サイトを参考に作成したものは、自己責任でお願いします。
実行前のレビューやテストを必ず実施してください。

それでは、今回もよろしくお願いします。

【講釈】「引数」とは

さっくり説明します。
バッチを呼び出す際に、そのバッチに渡したい値をやり取りするための変数です。

コマンドプロンプトで記述したコマンドライン(バッチと引数)は
その先頭から末尾までの文字列を
・ (半角)スペースで区切り
・ 区切られた文字列のアイテムを引数として
バッチを起動します。
ただし、ダブルクォーテーションで囲まれたスペースでは区切りません。

文字で書くと難しいですよね。。。

引数のサンプル

具体的な例のほうが分かりやすいかもしれません。

@echo off
    rem **********************************************
    rem 第1引数、第3引数 : 演算する数値(整数値)
    rem 第2引数 : 演算子(以下)
    rem 演算子 : 和 + 、差 - 、積 * 、商 / 、余 %
    rem **********************************************

    set /a @ans=%1 %2 %3
    echo %1 %2 %3 = %@ans%
    set @ans=

コード部分をダプルクリックすると全選択されますので、コピーしテキストエディタ(メモ帳など)貼り付け、BatCal.bat という名前で保存してください。文字コードANSIです。

コマンドプロンプトを起動し、BatCal.batを保存したフォルダをカレントフォルダに変更して以下のようにコマンドを入力します。

    BatCal 256 * 4

引数のサンプルの解説

このサンプルでは、3つの引数を指定し演算するものです。
なお、バッチでは小数を扱うことができませんので、引数で指定できる数値は整数値です。
また、商の演算結果で小数点以下は切り捨てられます。

第1引数は、%1 で受け取ります。("%"の直後に記載した数字が引数番号です)
同様に、第2引数は %2 、第3引数は、%3 で受け取ります。

第2引数は演算子で以下となります。
 和 : +
 差 : -
 積 : *
 商 : /
 余 : %
第1引数と第3引数を第2引数で指定した演算方法で計算した結果を表示します。

このように、引数は、"%"と数字(1桁)で表します。
したがって、引数は %1 から %9 までの9種類を直接受け取ることができます。

バッチの中で、数値計算している set文 は"/a"を付けることで計算することができます

バッチの引数の数は?

上でも触れましたが、引数は %1 から %9 までの9種類を受け取ることができますが、
バッチを呼び出すコマンドラインで指定できる引数の数の上限はありません。

どういうことなのでしょうか?

バッチの言語仕様上の問題と思われますが、
引数の変数名は "%" と 1桁の数字 となっているため、%9 までしか受け取ることができません。

では、どうやって受け取るのか?
その場合には、shift を利用します。

これも具体的なサンプルのほうが分かりやすいと思います。

@echo off
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9
    echo shift します
    shift
    echo 引数 : %1 %2 %3 %4 %5 %6 %7 %8 %9

コード部分をダプルクリックすると全選択されますので、コピーしテキストエディタ(メモ帳など)貼り付け、BatShift.bat という名前で保存してください。文字コードANSIです。

コマンドプロンプトを起動し、BatShift.bat を保存したフォルダをカレントフォルダにして以下のコマンドを実行してみてください。

 BatShift p01 p02 p03 p04 p05 p06 p07 p08 p09 p10 p11 p12 p13 p14 p15

実際問題、バッチを作成する際には多くの方が、
何番目の引数は○○ というように引数の順番に意味を持たせることが多いと思います。
その前提に立てば、現実的に有効な引数の数は数個ではないでしょうか?

shiftを使うことで、現実離れした仕様のバッチも作成可能ということです。

%1 と %~1 の違い

ダブルクォーテーションで囲まれた値を引数として指定された場合
%1 → ダブルクォーテーションを含んだ指定されたそのものを参照する。
%~1 → ダブルクォーテーションを撤去した状態で参照する。
「1」は第1引数を表す、第2~第9引数はそれぞれ2~9となり、
考え方は同じである。

用途は、パス情報を引数で指定する場合になります。

@echo off
    echo %%1  : %1
    echo %%~1 : %~1
    echo %%2  : %2
    echo %%~2 : %~2

コード部分をダプルクリックすると全選択されますので、コピーしテキストエディタ(メモ帳など)貼り付け、Sample01.bat という名前で保存してください。文字コードANSIです。

コマンドプロンプトを起動し、Sample01.bat を保存したフォルダをカレントフォルダにして以下のコマンドを実行してみてください。

 Sample01 "C:\Program Files\Common Files" "C:\Program Files (x86)"

ちがいが判りましたか?

%0は?

バッチが呼び出されたときに、コマンドプロンプトで記述した内容(Enterキーを押下するまでに入力した内容)は今回説明している引数としてバッチに渡されます。
コマンドプロンプトで指定した内容は、
スペースで分割され、先頭より第0引数(%0)、第1引数(%1)・・・のように渡されてきます。
ただし、ダブルクォーテーションで囲まれたスペースでは分割されません。

したがって、「%0」は、バッチを起動した際のバッチ名(記述した内容)になります。
test.bat の場合、%0はtest.bat
test の場合(.batを省略)、%0はtest
バッチファイル名の前にフォルダが書かれている場合も同様です。

%0 は、ダブルクォーテーション付き、
%~0は、ダブルクォーテーションなし で参照することができます。

おわりに

今回の特集、引数はいかがでしたか?

引数を活用することで、バッチを汎用化することができます。
固定値を持たないようにすることで、特定の環境(フォルダ構成など)に依存しないものにできます。

%や〜、記号だらけ
見た瞬間に「ウザッ」と思う人も多いと思いますが、当ブログの「バッチ特集」で、少し理解が深まると嬉しいです。

特に、第1回の 
cd /d %〜dp0 (カレントフォルダをバッチのフォルダに変更)
と組み合わせることで、特定の環境に依存させない汎用化が実現できます。

また、「引数」はほとんどのプログラム言語でも利用できます。(詳細は各言語の仕様をご確認願います)

テスト環境でいろいろ試してみてください。
やはり多くの経験、いざと言うときに使えます。

今回は、解説中心の内容になってしまいました。

それでは


くろねこ自由気ままな日記

バッチ特集の過去の記事は下記をクリック願います。

www.kuronekofreedom.com

 

ブログランキング・にほんブログ村へ
© 2020 くろねこ自由気ままな日記