バッチファイルでの「UNC パスはサポートされません」はエラーではない

More than 1 year has passed since last update.


知ってました??

ネットワークドライブ上にあるバッチファイルを実行すると、


上記の現在のディレクトリで CMD.EXE を開始しました。

UNC パスはサポートされません。Windows ディレクトリを既定で使用します。


と表示されます(Windows 7の場合)。UNCパスというのは"\\server\hoge"みたいなやつですね。私は今までこれを見て「あー、サーバ上でバッチファイルを実行しちゃダメなんだー」と思っていたんですが、実はこれはエラーではなく警告なので、バッチファイル自体はそのまま実行されます(知らなかった…)。

で、その場合に何が起こるのかというと、

カレントディレクトが"C:\Windows"に変更されるだけ

なんです。つまり、そのバッチファイルがどのディレクトリあっても正しく動くように作られていれば、ちゃんと動きます。


ネットワークドライブ上でも使えるバッチファイル

ネットワークドライブ上でも問題なく使えるバッチファイルを作るには、

ファイルをフルパスで指定する

必要があります。というか、これだけ守ればOKです。例えば、バッチファイルのあるフォルダに何らかの結果を出力する場合は、こんな感じでバッチファイルが置かれたパスを取得します。


バッチファイル

@echo off

echo %~dp0
echo hoge> %~dp0hoge.txt


cmd.exe

'\\server\hoge'

上記の現在のディレクトリで CMD.EXE を開始しました。
UNC パスはサポートされません。Windows ディレクトリを既定で使用します。
\\server\hoge\


\\server\hoge\hoge.txt

hoge


見た目がちょっと不思議な構文なんですが、"%0"は実行ファイル名で、"~d"がドライブ名、"~p"がパス名。その組み合わせ"~dp"で実行ファイル名からパスを取り出すことができます(出力される文字列には終端に"\"が含まれる&ダブルクォーテーションを含まない)。

これで、変更された先の"C:\Windows"ではなく、ちゃんとバッチファイルのあるサーバのUNCパスが取得できました。あとはファイル名なりサブフォルダ名を付加して実行ファイルを呼んだり、ログファイルやテンポラリファイルにももちろん付けて(C:\Windowsに書き出すのはさすがにまずいので)、いつも通りの処理を行いましょう。


補足

なお、バッチファイルでのファイルパスに関する詳細の公式ドキュメントはここの"Using batch parameters"に書いてあります。残念ながら日本語版は見つからず。いろんな人が勝手翻訳してるので探してみてください。

https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/batch.mspx