问题典型的解决方案:给定一个文件名和字符串的任意列表,有没有规范的方法创建一个单一的命令行,使得Environment.GetCommandLineArgs(和C#的void main(String[] args)
/VB的Sub Main(args() As String)
)将返回相同的字符串列表?转义.NET命令行参数
背景:该方式.NET分割命令行参数成是surprisingly complex,例如:
如果一个双引号如下两个或偶数反斜杠,每个出发反斜杠对被替换为一个反斜杠,并删除双引号。如果双引号后面有奇数个反斜杠,包括一个反斜杠,则每个前一对都用一个反斜杠代替,剩下的反斜杠将被删除;但是,在这种情况下,双引号不会被删除。
许多人尝试简单的“把每个参数放在双引号中并且逃避现有双引号”的方法,并且只要其中一个参数包含尾部反斜杠就会失败。已经有在计算器上对这个问题的各种问题,如:
- How to escape path containing spaces
- Escape command line arguments in c#
- Escape string for Process.Start
- Passing command-line arguments in C#
然而,他们的答案要么是无法满足需求的提供所有案例的标准解决方案或似乎是“迭代式”开发的(“哦,还有一个我忘了的特殊情况,让我们的广告它和现在它应该涵盖大部分情况......“)。由于这是一个相当普遍的问题,我想看到的是提供了信心,例如一个解决方案,方法是
- 从权威渠道(也许从参与这个疯狂的开发商一个博客条目来命令行约定)或
- 提供给定算法满足.NET命令行要求的正式证明。
追求这个问题的通用解决方案是非常没有成效的。将数据写入文件,改为传递文件的路径。 –
我同意汉斯。一旦你有了解决方案,你会怎么做? – neontapir
@HansPassant:你并不总是能够控制* called应用程序(现在许多应用程序*都使用多个命令行参数)。因此,* calling应用程序的编写者可能希望确保参数编码正确(理想情况下,无需重新发明轮子并每次都仔细研究Windows/.NET命令行转义语法)。 – Heinzi