18

我正在尝试使用 Process.Start(ProcessStartInfo) 从 c# 运行命令行应用程序;

问题是,cmd 行应用程序是一个 matlab 独立的 .exe,并且具有可选参数,这意味着您可以将它们传递到 cmd 行,如下所示:

app.exe "optional1" optional1value "optional2" optional2value

其中optional1value是整数或字符串等。

我们遇到的问题是双引号没有作为“可选1”参数的一部分传递,所以我相信 cmd.exe 会得到类似的东西:

app.exe optional1 optional1value optional2 optional2value

或类似的东西,matlab的解析器显然会被混淆。

我努力了:

@"""optional1"" optional1value ""optional2" optional2value"""

正如其他一些关于 cmd 行参数中双引号的 SO questions 中所建议的那样,但它似乎对我不起作用,也不是:

"\"optional1\" optional1value \"optional2\" optional2value\""

我写了一个小的 c# 命令行 .exe 来打印它得到的参数。如果我将命令行参数放在 VS Project->Debug 区域并运行它,那么它会用双引号打印它们,但是由于所有转义等,当我在代码中执行此操作时,.exe 会打印不带任何双引号的参数。

我发现这篇关于它的文章可能是 .NET 3.5 的 cmd 解析器中的一个错误,但似乎找不到可行的解决方案。

有没有人有任何想法?

感谢您的时间,

雨披

PS 有没有办法在使用 Process.Start() 发送参数时查看 cmd.exe 得到什么?我的进程打开了一个 cmd 窗口,但很高兴看到 cmd.exe 得到的行,例如:“app.exe optional1 optional1value”等。

再次感谢。

4

1 回答 1

20

引号 inProcessStartInfo.Arguments必须转义为三个引号 ( """)。这是因为单引号用于将包含空格的字符串作为单个参数传递。

请参阅此处的文档。

var psi = new ProcessStartInfo(
    "cmd_app.exe",
    "\"\"\"optional1\"\"\" optional1value \"\"\"optional2\"\"\" optional2value");
Process.Start(psi);

cmd_app.exe 所做的只是宣布它的 # of args 和 args 是什么,通过这个输入它显示:

"optional1"
optional1value
"optional2"
optional2value
于 2013-01-15T14:49:24.980 回答