次のように、COM "Windows Script Host Object Model" IWshRuntimeLibrary を使用してショートカットを読んでいます。
IWshShell wsh = new WshShellClass();
IWshShortcut sc = (IWshShortcut)wsh.CreateShortcut(shortcutFile);
string arguments = sc.Arguments;
これにより、ショートカットからの引数が得られます。たとえば、次のようになります。
-a "c:\temp\a 1.txt" -b "b.exe -c \"c:\temp\c -2.txt\" -d d.txt" -e test
これは、ご想像のとおり不自然な例ではありません...どうすれば GetCommandLineArgs と同じことを実行して取得できますか:
args {string[6]}
[0] = "-a"
[1] = "c:\\temp\\a 1.txt"
[2] = "-b"
[3] = "b.exe -c \"c:\\temp\\c -2.txt\" -d d.txt"
[4] = "-e"
[5] = "test"
私は正規表現を考えていますが、これは私のブラケットを超えています。
[編集] 正規表現の方がいいのですが、言及されているコードとクラスを見ていきます。
ルールは次のようです。
- スペースで分割し、
- スペースが二重引用符 (") で囲まれている場合を除きます。
- 二重引用符で囲まれた文字列には、バックスラッシュ (\") でエスケープされた二重引用符を含めることができます。
- 他のバックスラッシュは単独で表示される場合がありますが、通常の文字として扱う必要があります
前の 2 つのコード セクションの引数と配列は、適切なテストになります。
[編集] https://stackoverflow.com/a/749653/350188が私の質問に答えました。ネイティブ システム関数を呼び出し、GetCommandLineArgs() とまったく同じ結果が得られます。
string[] splitArguments = CommandLineToArgs(arguments);