【发布时间】:2012-11-27 14:48:10
【问题描述】:
问题:给定一个文件名和一个任意字符串列表,是否有一种规范的方式来创建单个命令行,例如 Environment.GetCommandLineArgs(和 C# 的 @ 987654327@/VB 的Sub Main(args() As String)) 会返回相同的字符串列表吗?
背景:.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#
但是,他们的答案要么不够笼统,无法为所有案例提供规范的解决方案,要么似乎是“迭代地”开发的(“哦,我忘记了另外一个特殊情况,让我们添加它并现在 em> 它应该涵盖大多数情况...")。由于这是一个相当普遍的问题,我希望看到一个提供信心的解决方案,例如,通过任一
- 来自权威来源(可能是参与此疯狂命令行约定的开发人员之一的博客条目)或
- 提供给定算法满足 .NET 命令行要求的正式证明。
【问题讨论】:
-
追求一个通用的解决方案来解决这个问题是非常低效的。将数据写入文件,改为传递文件的路径。
-
我同意汉斯的观点。获得解决方案后,您会如何处理?
-
@HansPassant:您并不总是能够控制被调用的应用程序(今天许多应用程序确实使用多个命令行参数)。因此,calling 应用程序的编写者可能希望确保参数被正确编码(理想情况下,不必每次都重新发明*并详细研究 Windows/.NET 命令行转义语法) .
标签: c# .net vb.net command-line-arguments