これは、コマンドプロンプト(cmd.exe) Advent Calendar 2015 - Qiitaの8日目の記事です。※Windows 10 Home 64bit 搭載のcmd.exeにて検証を行っています。

### call /? ``` バッチ プログラムを別のバッチ プログラムから呼び出します。

CALL [ドライブ:][パス]ファイル名 [バッチパラメーター]

バッチパラメーター バッチ プログラムで必要なコマンド ライン情報を指定します。

コマンド拡張機能を有効にすると、CALL は次のように変更されます:

CALL コマンドは、CALL のターゲットとしてラベルを受け付けるようになります。 構文は、次のとおりです:

CALL :ラベル 引数

指定された引数で新しいバッチ ファイル コンテキストが作成され、指定 されたラベルの次の文に制御が渡されます。バッチ スクリプト ファイルの 最後に 2 回到達することによって、2 回 “終了” する必要があります。 1 回目に最後に到達したときには、制御は CALL 文の次の行に返されます。 2 回目に、バッチ スクリプトが終了します。バッチ スクリプトから “戻る” ための GOTO :EOF 拡張機能の説明については、GOTO /? と入力してください。

また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように 変更されました:

%* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
    %5 など) を参照します。

バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
を使うことができます:

    %~1         - すべての引用句 (") を削除して、%1 を展開します。
    %~f1        - %1 を完全修飾パス名に展開します。
    %~d1        - %1 をドライブ文字だけに展開します。
    %~p1        - %1 をパスだけに展開します。
    %~n1        - %1 をファイル名だけに展開します。
    %~x1        - %1 をファイル拡張子だけに展開します。
    %~s1        - 展開されたパスは、短い名前だけを含みます。
    %~a1        - %1 をファイル属性に展開します。
    %~t1        - %1 をファイルの日付/時刻に展開します。
    %~z1        - %1 をファイルのサイズに展開します。
    %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                   最初に見つかった完全修飾名に %1 を展開します。
                   環境変数名が定義されていない場合、または
                   検索してもファイルが見つからなかった場合は、
                   この修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dp1       - %1 をドライブ文字とパスだけに展開します。
    %~nx1       - %1 をファイル名と拡張子だけに展開します。
    %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                   検索して %1 を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftza1     - %1 を DIR の出力行のように展開します。 

上の例の %1 と PATH は、他の有効な値で置き換えることができ
ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
は %* と同時には使用できません。
1
2
3
4
5
6
<br/>


<div class="section">
    #### バッチパラメータの展開
    さて、なぜかこのcall /?内に、バッチパラメータに関する重要なことが記載されています。

また、バッチ スクリプトの引数参照 (%0、%1 など) の展開は、次のように 変更されました:

%* バッチ スクリプト内では、すべての引数 (%1、%2、%3、%4、
    %5 など) を参照します。

バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
を使うことができます:

    %~1         - すべての引用句 (") を削除して、%1 を展開します。
    %~f1        - %1 を完全修飾パス名に展開します。
    %~d1        - %1 をドライブ文字だけに展開します。
    %~p1        - %1 をパスだけに展開します。
    %~n1        - %1 をファイル名だけに展開します。
    %~x1        - %1 をファイル拡張子だけに展開します。
    %~s1        - 展開されたパスは、短い名前だけを含みます。
    %~a1        - %1 をファイル属性に展開します。
    %~t1        - %1 をファイルの日付/時刻に展開します。
    %~z1        - %1 をファイルのサイズに展開します。
    %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                   最初に見つかった完全修飾名に %1 を展開します。
                   環境変数名が定義されていない場合、または
                   検索してもファイルが見つからなかった場合は、
                   この修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dp1       - %1 をドライブ文字とパスだけに展開します。
    %~nx1       - %1 をファイル名と拡張子だけに展開します。
    %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                   検索して %1 を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftza1     - %1 を DIR の出力行のように展開します。 

上の例の %1 と PATH は、他の有効な値で置き換えることができ
ます。%~ 構文は有効な引数の数によって区切られます。%~ 修飾子
は %* と同時には使用できません。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
forの時と同様の解説となりますが、以下のような感じです。<br/>
<br/>


<ul>
<li>「%~dp1」…絶対パスで、第一引数をフォルダまで展開</li>
<li>「%~n1」…第一引数を、拡張子を除くファイル名に展開</li>
</ul>当然ラベルへ飛んだ時の引数も展開できるので、いろいろ便利です。<br/>
いじょ!

</div>
</div>