バッチファイルで複数引数のワイルドカードを展開させる

諸事情により、バッチファイルを書いた。MS-DOSコマンドプロンプトの*.batなアレだ。既存のプログラムのラッパーで、普段はシェルスクリプトで書くような内容だが、環境変数周りで少々問題があって諦めてバッチファイルにしたという経緯がある。

WSHWindows Script Host)を通り越してWindows PowerShellが盛んに宣伝されているというのに、今更バッチファイルというのもダサい話だ。でも既存のプログラムのラッパーを作るにはWSHは不向きだし、わざわざPowerShellをインストールするのも面倒だ。

ところでシェルスクリプトでは引数にワイルドカードを使用すると自動的に展開してくれるのだが、バッチファイル(というかコマンドプロンプト)では展開してくれない。コマンドプロンプトにはワイルドカードを展開してくれる機能が無いので、個々のアプリケーション側で必要に応じてワイルドカードを展開する機能を実装する必要がある。

で、バッチファイルを書くにあたり、バッチファイル側でワイルドカードの展開をするようにしてみた。それも複数個の引数に対応したものだ。

という訳で、以下サンプル。
試しにワイルドカードから展開された内容を含む全引数を画面に出力させている。

:: wildcard.bat
:: コマンドプロンプトではワイルドカードを自動的に展開してくれない。
:: そこでバッチファイルの各引数ごとに forを使用してファイル名を取り出す。
:: 引数が通常のファイル名なら、そのまま %%iに渡されて処理される。
:: ワイルドカードなら展開されて、 1つずつ %%iに渡されて処理される。

@echo off
:LOOPSTART
	if "%~1" == "" (
		goto LOOPEND
	)
	for %%i in (%1) do (
		if exist %%i (
			echo %%i
		) else (
			echo not exist: %%i
		)
	)
	shift
	goto LOOPSTART
:LOOPEND

ちなみに既知のバグが一件ある。引数の中に「""」があるとその時点でループを抜けてしまうという、なんとも間抜けなバグだ。何とかならないか思案したが、未だ解決策は見つかっていない。