なんらかの理由があって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の記法があるといいんだけど無いっぽい?