4

我正在阅读使用 COM“Windows 脚本宿主对象模型”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"

我在想正则表达式,但这超出了我的范围。

[编辑] 我更喜欢正则表达式,但我会看看提到的代码和类。

规则似乎是:

  • 按空格分割,
  • 除非空格在双引号 (") 内。
  • 双引号内的字符串可能包含用反斜杠 (\") 转义的双引号。
  • 其他反斜杠可能会单独出现,但应视为普通字符

前两个代码部分中的参数和数组将是适当的测试。

[编辑] https://stackoverflow.com/a/749653/350188已经回答了我的问题。它调用本机系统函数并给我与 GetCommandLineArgs() 完全相同的结果:

string[] splitArguments = CommandLineToArgs(arguments);
4

3 回答 3

1

这没有什么棘手的。您可以使用基本的 C# 语法来检查单个字符是否解析出您需要的内容。

例如,您可以String.IndexOf()找到您正在寻找的特定字符。您可以使用它String.Substring()来提取字符串的一部分。

我已经在文章AC# Command-Line Parser中发布了解析命令行的代码。

于 2013-02-19T15:29:22.717 回答
0

最简单和健壮的解决方案是使用解析器的一些实现,例如,这个或像命令行解析器库这样的库取决于您在应用程序中究竟需要什么。

于 2013-02-20T07:48:13.233 回答
-3

如果您只是想要像 GetCommandLineArgs 产生的数组中的参数,您可以使用 string.Split:

string[] args = arguments.Split(' ');
于 2013-02-19T15:51:55.637 回答