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

标签 c#

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

据我所知,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/

相关文章:

c# - TFS 对象模型 : Do WorkItems keep sessions open?

c# - ChromeDriver 窗口不会重新调整大小以适应 Nexus 5 的尺寸

c# - ListView Group Header 无法解析绑定(bind)属性

c# - 我要疯了吗? C#/静态修饰符

c# - 检查 richtextbox 上的选定文本是否全部为粗体

c# - 摩托罗拉 MC3190 扫描时的奇怪行为

c# - 对象与对象[]

c# - Windows Phone 键盘打开事件和属性

c# - 即使 autopostback=true,OnSelectedIndexChange 也不会触发

c# - 在哪里练习Lambda函数?