LoginSignup
6
8

More than 5 years have passed since last update.

Windowsのbatファイルで"%~dp"と書いてはいけない

Posted at

なんらかの理由があってbatファイル経由でexeに自分自身のディレクトリを渡す必要があるとする

hoge.bat
hoge.exe path="%~dp0" kage="sage" mage="gege"

このように書いてはいけない。

何故ならこれは展開されると
hoge.exe path="c:\temp\" kage="sage" mage="gege"
となる。

c#で引数を順番に表示すると

text.cs
static void Main(string[] args) {
    foreach (var i in args) {
        Console.WriteLine($"i=[{i}]");
    }
}

こうなる

コンソール
i=[path=c:\temp" kage=sage mage=gege]

大事故になる。

この場合はこうすればよい

hoge.bat
hoge.exe path="%~dp0." kage="sage" mage="gege"

これが
hoge.exe path="c:\temp\." kage="sage" mage="gege"
こうなって

コンソール
i=[path=c:\temp\.]
i=[kage-sage]
i=[mage=gege]

全てよろし

パスとして扱いにくいフォーマットになっちゃってるので、c#ならSystem.IO.Path.GetFullPath(i)を通すとよい。
System.IO.Path.GetFullPath(@"c:\windows\.")c:\windowsとなる。今度は最後にバックスラッシュが無い。
存在しないパスを指定すると例外が出てしまう

System.NotSupportedException はハンドルされませんでした。
  HResult=-2146233067
  Message=指定されたパスのフォーマットはサポートされていません。
  Source=mscorlib
  StackTrace:
       場所 System.Security.Permissions.FileIOPermission.QuickDemand(FileIOPermissionAccess access, String fullPath, Boolean checkForDuplicates, Boolean needFullPath)
       場所 System.IO.Path.GetFullPath(String path)
   InnerException: 

めんどくさい

最初からc:\tempと展開されるbatの記法があるといいんだけど無いっぽい?

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8