言うだけ言ってみる

なんとなく記録。

Windows 10のコマンドプロンプトでワイルドカードは部分一致なので注意

2017年04月28日 | Weblog
不要なファイルを一括削除するときに使うワイルドカードですが、
例えばよくこのように紹介されています。

Excelの旧ファイル、拡張子xlsのファイルをすべて削除

del *.xls

実は、これには落とし穴があって、「*」を使うと、それ以外のところも部分一致になるのです。
そのため、xlsファイルを削除しようとして、del *.xls とやると、aaa.xlsだけでなく、
aaa.xlsxも消してしまうのです。つまり、拡張子での絞り込みが効いていない。

ファイル名をダブルコーテーションでくくってもダメ。

del "*.xls"

試しに、以下のようなバッチを実行してみると、

for %%A in ("*.xls") do echo %%A
pause

aaa.xlsとaaa.xlsxの両方が出力されます。

この現象が発生するのは、ワイルドカードを使用した場合で、
*.xls2、*.xlsabcなど、 拡張子xlsのうしろに何か付いていても対象になってしまいます。

もちろん、dirコマンドでも dir *.xls で、aaa.xlsとaaa.xlsxの両方が出力されます。
(ダブルコーテーションでくくってもダメ)

ここで変なのは、拡張子を2文字だけにして

dir *.xl

とすると、aaa.xlsもaaa.xlsxも出てきません。
これが本来、期待される挙動です。
(xlという拡張子のファイルを探してなかった、という挙動)

拡張子2文字のときと3文字のときで、挙動に差があります。
(Windows 8までは、拡張子3文字でもちゃんと上記2文字の時のように動いていました)

Windows 10でのワイルドカードの扱いが明らかにおかしいと思いますが、
ワイルドカードを使用する限り、この挙動が出て来てしまうので、
この方法で、ファイルを拡張子で確実に絞り込めるとは思わないほうがいいです。

拡張子は3文字のファイルしか存在しない、という前提であればいいですが。