15

问题:给定一个文件名和一个任意字符串列表,是否有一种规范的方法来创建单个命令行,这样Environment.GetCommandLineArgs(和 C#'s void main(String[] args)/ VB's Sub Main(args() As String))将返回相同的字符串列表?


背景:.NET 将命令行拆分为参数的方式非常复杂,例如:

如果双引号跟在两个或偶数个反斜杠之后,则将前面的每个反斜杠对替换为一个反斜杠并删除双引号。如果双引号后面有奇数个反斜杠,包括一个,则前面的每一对都被一个反斜杠替换,其余的反斜杠被删除;但是,在这种情况下,不会删除双引号。

许多人尝试简单的“将每个参数放在双引号中并转义现有的双引号”方法,但一旦其中一个参数包含尾部反斜杠,就会失败。StackOverflow 上有关于这个问题的各种问题,例如:

但是,他们的答案要么不够通用,无法为所有案例提供规范的解决方案,要么似乎是“迭代地”开发的(“哦,还有一个我忘记了的特殊情况,让我们添加它,现在它应该涵盖大多数情况...... ”)。由于这是一个相当普遍的问题,我希望看到一个提供信心的解决方案,例如,通过

  • 来自权威来源(可能是参与这个疯狂命令行约定的开发人员之一的博客条目)或
  • 提供给定算法满足 .NET 命令行要求的正式证明。
4

2 回答 2

3

This algorithm is generic and comes from a relatively authoritative source (MSDN blogs).

于 2012-12-10T22:05:33.983 回答
1

几年前,微软宣布他们将在 CodePlex 上发布一个命令行解析器(而不是应该与 .NET Framework 4 一起发布的 System.Shell.CommandLine)。我不确定他们是否真的这样做了。如果您想要由 Microsoft 员工开发的解析器,请查看cmdline。您还可以在CodePlex中查找命令行解析。

您也可以尝试非常强大的Mono.Options 。

于 2012-12-10T11:29:13.967 回答