« なぜかActiveDirectoryで認証されない無線LAN | トップページ | ネットワークボリューム上のファイルをバッチファイルで操作 »

2018年4月 7日 (土)

コマンド引数を別のバッチファイルへ渡すとき

次のようなバッチファイルを作り、最初のバッチファイルに空白を含んだ引数をダブルクォーテーションで括って渡すと動作が期待した通りにならない。正しくは、期待が間違っているとか、実装が間違っているとかいうことなんだが。

一つ目のバッチファイル「A.BAT」
call B.BAT "%1"

二つ目のバッチファイル「B.BAT」
echo %1

コマンドプロンプトで「A.BAT TEST」を実行すると、B.BATのechoで「TEST」が表示される。
コマンドプロンプトで「A.BAT "TEST SPACE"」を実行すると、B.BATのechoで「""TEST」が表示される。

期待通り動作していない後者では、一つめのバッチファイルA.BATに渡される引き数は "TEST SPACE" であるが、ふたつ目のB.BATに渡される引き数は ""TEST SPACE"" になっている。

これは、最初のバッチファイルAを呼び出すときに引数をまとめたダブルクォーテーションにさらにダブルクォーテーションを加えて次のバッチファイルBに渡しているために、B.BATが受け取った引数は ""TEST SPACE"" となっているのだが、最初の""で文字列の囲みが閉じられてしまい、TESTとSPACEの間の空白が引き数のセパレータだと解釈された結果 ""TEST で一つの引数と解釈されてしまっている。

これを回避するには、A.BATを次のようにすればよい。
call B.BAT "%~1"

%~1とすることで、1番目の引数からダブルクォーテーションを取り除き、あらためてダブルクォーテーションで挟んでB.BATへ渡すことができる。

この修正版の実行結果はechoが「TEST SPACE」を出力する。

よく考えると当たり前なのだが、軽くはまってしまったのでメモしておく (^^;)

|

« なぜかActiveDirectoryで認証されない無線LAN | トップページ | ネットワークボリューム上のファイルをバッチファイルで操作 »

Windows」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: コマンド引数を別のバッチファイルへ渡すとき:

« なぜかActiveDirectoryで認証されない無線LAN | トップページ | ネットワークボリューム上のファイルをバッチファイルで操作 »