问题:给定一个文件名和一个任意字符串列表,是否有一种规范的方法来创建单个命令行,这样Environment.GetCommandLineArgs(和 C#'s void main(String[] args)
/ VB's Sub Main(args() As String)
)将返回相同的字符串列表?
背景:.NET 将命令行拆分为参数的方式非常复杂,例如:
如果双引号跟在两个或偶数个反斜杠之后,则将前面的每个反斜杠对替换为一个反斜杠并删除双引号。如果双引号后面有奇数个反斜杠,包括一个,则前面的每一对都被一个反斜杠替换,其余的反斜杠被删除;但是,在这种情况下,不会删除双引号。
许多人尝试简单的“将每个参数放在双引号中并转义现有的双引号”方法,但一旦其中一个参数包含尾部反斜杠,就会失败。StackOverflow 上有关于这个问题的各种问题,例如:
但是,他们的答案要么不够通用,无法为所有案例提供规范的解决方案,要么似乎是“迭代地”开发的(“哦,还有一个我忘记了的特殊情况,让我们添加它,现在它应该涵盖大多数情况...... ”)。由于这是一个相当普遍的问题,我希望看到一个提供信心的解决方案,例如,通过
- 来自权威来源(可能是参与这个疯狂命令行约定的开发人员之一的博客条目)或
- 提供给定算法满足 .NET 命令行要求的正式证明。