如何使用任意参数字符串干净地生成进程

时间:2011-04-25 11:17:58

标签: c#

我希望用一组给定的参数生成一个命令,这些参数可以是任意字符串 - 特别是,一个参数可以包含空格,冒号等。我想这样做而不必逃避参数字符串(s),主要是因为我发现它几乎不可避免地导致在某些时候出现过度,不足或误逃。

据我所知,使用System.Diagnostics.Process API无法做到这一点 - ProcessStartInfo.Arguments总是在空格上拆分字符串,并对其他一些字符有一些特殊的解释。我目前正在做的是产生xargs --null(我在Linux上开发),使用命令运行并通过stdin向它提供参数。这是有效的,但不会为最美丽的解决方案赢得任何奖项。

是否有更好的.NET API用于做我想要的事情?

编辑:例如,请考虑传递参数“I am a filename with crazy characters "'%1!#\^*☺” fear my splitting。有可能逃脱 - 据我所知所有需要发生的事情就是在它周围抛出"然后使用{{1}转义嵌入式" }。只是不必逃避它就会更清晰,更简单,也不会出错。

1 个答案:

答案 0 :(得分:2)

我不认为在程序中传递几个参数在Windows中是正确标准化的。启动进程时,可以将命令行传递给可执行文件。但是如何解释这个命令行,取决于该程序。

理论上,每个程序都可以使用不同的方案将命令行拆分为单个参数,以及转义空格,引号和特殊字符。

在实践中,大多数程序将使用命令行拆分,它是VisualStudio C标准库的一部分。如果安装了VisualStudio(包括C / C ++部分),您将在文件C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\stdargv.c

中找到命令行解析代码

如果我正确理解了代码,规则很简单:

  • 多个参数由空格(空格和制表符)分隔
  • 可以使用双引号引用参数(如果它们包含空格,则必须引用它们)
  • 如果参数包含双引号,则必须使用反斜杠转义双引号
  • 当且仅当后面跟一个双引号时,反斜杠必须加倍。

为了构建有效的命令行,这些规则应该直接实现。但据我所知,没有Windows或C#功能提供此功能。