C#进程启动需要带有双引号的参数,但它们会消失。

21

我正在尝试使用Process.Start(ProcessStartInfo)从C#运行一个命令行应用程序。

问题在于,这个命令行应用程序是一个Matlab独立的.exe文件,并且有可选参数,这意味着你要在命令行上传递它们,如下所示:

app.exe "optional1" optional1value "optional2" optional2value

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

我们遇到的问题是双引号没有作为"optional1"参数的一部分传递,因此我认为cmd.exe收到了类似以下内容的信息:

app.exe optional1 optional1value optional2 optional2value

或类似的东西,这显然会让Matlab的解析器混淆。

我已经尝试过:

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

正如其他 Stack Overflow 问题中有些人建议的那样,关于 cmd 行参数中的双引号,但对我来说似乎并没有起作用,也不会:

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

我写了一个小的 C# 命令行 .exe 程序来打印它接收到的参数。如果我将命令行参数放在 VS 项目 -> Debug 区域中并运行它,那么它会带着双引号打印出来,但是因为所有的转义等等,当我在代码中这样做时,.exe 不会打印任何双引号。

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

有人有什么想法吗?

谢谢你们的时间,

Poncho

P.S. 是否有办法查看通过 Process.Start() 发送参数时 cmd.exe 得到的内容? 我的进程会打开一个 cmd 窗口,但很好看到 cmd.exe 得到的命令行,例如:"app.exe optional1 optional1value" 等等。

再次感谢。


你能否发布一下声明进程对象并调用start方法的代码片段? - Dhawalk
为什么在 optional2value 后面有额外的引号?我认为你的引号在结果中将不平衡。 - H H
作为一种解决方法:您可以在c#程序中添加引号吗?作为另一种解决方案,或许可以升级到.NET 4.0?作为另一种解决方法:使所有值都是必需的,并使用固定的输入参数顺序? - Dennis Jaheruddin
如果您直接运行程序,它会将 cmd 窗口的标题栏更改为您调用的完整路径和参数吗? - ldam
关于问题中提到的文章,文章顶部有更新说明它不是一个错误,实际上是一种“特性”。 - TaRDy
显示剩余4条评论
1个回答

25

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

请查看此处的文档。

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

cmd_app.exe仅仅是宣布其参数的数量和参数是什么,根据输入显示:

"optional1"
optional1value
"optional2"
optional2value

啊,看起来这个测试应用程序可以正常工作!我得等到明天回到工作岗位才能用Matlab脚本试一下,但还是感谢TaRDy给了我一线希望 :) - poncho
好的,我已经尝试了Matlab代码,但由于某种原因它无法工作。为了解决这个问题,我们已经更改了Matlab代码,不再使用可选参数,而是使用必需参数,C#应用程序会使用默认值填充未设置的参数。然而,我们现在遇到的问题是,其中一个参数是指向输入文件的路径,但如果该路径包含空格,则Matlab将其视为两个单独的参数,从而......我们需要再次使用引号......这又搞乱了它。有没有人在运行带引号参数的独立Matlab .exes时遇到过任何问题? - poncho
真是救命稻草。这让我疯了。对于那些试图从PowerShell执行一个带引号参数的命令的人来说,三引号技巧是有效的,只要确保用反引号(`)转义每个引号即可。 - afournier
尽管这对我不起作用,但是我使用了 $"app.exe \"{variablename}\""。不过还是谢谢你提供的指示。 - Thomas Uchiha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接