用于转义.NET命令行参数的规范解决方案

时间:2012-12-10 07:33:17

标签: c# .net vb.net command-line-arguments

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


背景:.NET将命令行拆分为参数的方式是surprisingly complex,例如:

  

如果双引号跟随两个或偶数个反斜杠,则每个前进的反斜杠对将替换为一个反斜杠,并删除双引号。如果双引号跟随奇数个反斜杠(包括只有一个),则每个前一对用一个反斜杠替换,剩下的反斜杠被删除;但是,在这种情况下,双引号不会被删除。

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

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

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

2 个答案:

答案 0 :(得分:3)

This algorithm是通用的,来自相对权威的来源(MSDN博客)。

答案 1 :(得分:1)

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

你也可以尝试Mono.Options,它非常强大。