2012-12-10 48 views
14

问题典型的解决方案:给定一个文件名和字符串的任意列表,有没有规范的方法创建一个单一的命令行,使得Environment.GetCommandLineArgs(和C#的void main(String[] args)/VB的Sub Main(args() As String) )将返回相同的字符串列表?转义.NET命令行参数


背景:该方式.NET分割命令行参数成是surprisingly complex,例如:

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

许多人尝试简单的“把每个参数放在双引号中并且逃避现有双引号”的方法,并且只要其中一个参数包含尾部反斜杠就会失败。已经有在计算器上对这个问题的各种问题,如:

然而,他们的答案要么是无法满足需求的提供所有案例的标准解决方案或似乎是“迭代式”开发的(“哦,还有一个我忘了的特殊情况,让我们的广告它和现在它应该涵盖大部分情况......“)。由于这是一个相当普遍的问题,我想看到的是提供了信心,例如一个解决方案,方法是

  • 从权威渠道(也许从参与这个疯狂的开发商一个博客条目来命令行约定)或
  • 提供给定算法满足.NET命令行要求的正式证明。
+0

追求这个问题的通用解决方案是非常没有成效的。将数据写入文件,改为传递文件的路径。 –

+0

我同意汉斯。一旦你有了解决方案,你会怎么做? – neontapir

+3

@HansPassant:你并不总是能够控制* called应用程序(现在许多应用程序*都使用多个命令行参数)。因此,* calling应用程序的编写者可能希望确保参数编码正确(理想情况下,无需重新发明轮子并每次都仔细研究Windows/.NET命令行转义语法)。 – Heinzi

回答

1

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

你也可以尝试Mono.Options这是非常强大的。

+1

+1 Mono.Options对我来说也表现得很好。 – kenny

+3

问题是关于创建一个命令行,而不是解析一个-1。 –

+0

@AntonTykhyy你是对的。我误解了这个问题。 –

2

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

+0

谢谢,看起来很有用。但是,它引发了[CommandLineToArgvW](http://msdn.microsoft.com/en-us/library/bb776391%28v=vs.85%29.aspx)和[Environment.GetCommandLineArgs](http:// msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs.aspx)表现相同。一些消息来源声称他们这样做,但文档似乎在“偶数反斜杠加引号”的情况下有所不同。 – Heinzi

+0

查看[.NET早期版本的文档](http://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs%28v=vs.80%29.aspx)。不同版本记录不同的行为。一团糟 :) –