我想用一组给定的参数生成一个命令,这些参数可以是任意字符串——特别是,单个参数可以包含空格、冒号等。我想这样做而不必转义参数字符串,主要是因为我发现它在某些时候几乎不可避免地导致过度、不足或错误转义。
据我所知,System.Diagnostics.Process
API 无法做到这一点 - ProcessStartInfo.Arguments
总是在空格处拆分字符串并具有对其他一些字符的一些特殊解释。我目前正在做的是使用命令生成 xargs --null
(我正在 Linux 上开发)并通过标准输入为其提供参数。这可行,但不会赢得任何最漂亮解决方案的奖项。
是否有更好的 .NET API 可用于执行我想要的操作?
编辑例如,考虑传递参数“I am a filename with crazy characters "'%1!#\^*☺” fear my splitting
。有可能逃脱 - 据我所知所有需要发生的事情就是围绕它抛出 "
然后转义嵌入的 "
和 \
。只是完全不用转义它会更清晰、更简单,也不太可能出错。
最佳答案
我不认为向程序传递多个参数在 Windows 中是正确标准化的。启动进程时,可以将命令行传递给可执行文件。但是如何解释此命令行取决于该程序。
理论上,每个程序都可以使用不同的方案将命令行拆分为单个参数并转义空格、引号和特殊字符。
在实践中,大多数程序将使用命令行拆分,它是 VisualStudio C 标准库的一部分。如果您安装了 VisualStudio(包括 C/C++ 部分),您将在文件 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src 中找到命令行解析代码\stdargv.c
如果我正确理解了代码,那么规则非常简单:
- 几个参数由空格分隔(空格和制表符)
- 参数可以用双引号引起来(如果它们包含空格则必须使用)
- 如果参数包含双引号,双引号必须用反斜杠转义
- 当且仅当它们后跟双引号时,反斜杠必须加倍。
为了构建一个有效的命令行,这些规则应该直接实现。但据我所知,没有提供此功能的 Windows 或 C# 函数。
关于c# - 如何使用任意参数字符串干净地生成进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5777798/