バッチファイルで’¥’と’/’の違い

今さらながら驚かされました。MS-DOS(DOSプロンプト)用バッチファイルの謎。そもそも、DOSバッチなんて何かのアプリの起動用とか、ファイル名の一括変換などでしか書いたことがなくて、UNIX/Linuxのシェルスクリプトみたいなことをやろうなんて思ったこともなかったもので。

ですが、今回のプロジェクトで、UNIX上のシェルスクリプトと、全く同じ動きをするDOSバッチを作成する必要があったので、いろいろと調べながら書いていきました。

で、一番驚いたのが、スラッシュ'/'とエンマーク'¥'の違い。

例えば、以下のようなバッチファイルを書いたとします。

@echo off
DIR=c:\usr
for %%i in ("%DIR%\*.txt") do echo %%i

c:\usr ディレクトリには、000.txt から 005.txt までの6つのファイルが存在していた場合、当然、実行結果は

c:\usr\000.txt
c:\usr\001.txt
c:\usr\002.txt
c:\usr\003.txt
c:\usr\004.txt
c:\usr\005.txt

となるわけです。しかし、これを以下のような書き方に変更すると

@echo off
DIR=/usr
for %%i in ("%DIR%/*.txt") do echo %%i

結果は、

000.txt
001.txt
002.txt
003.txt
004.txt
005.txt

となってしまうわけです。

¥マークで指定するとフルパスで結果が返り、/マークで指定するとファイル名のみが返る。なんでだろーなんでだろー。

ということで、今さらかもしれませんが、新発見でした。