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

C#进程启动需要带双引号的参数-它们会消失,c#,matlab,cmd,command-line-arguments,process.start,C#,Matlab,Cmd,Command Line Arguments,Process.start,我试图使用Process.Start(ProcessStartInfo)从c#运行cmd行应用程序 问题是,cmd行应用程序是一个matlab standalone.exe,具有可选参数,这意味着您在cmd行上传递它们,如下所示: app.exe "optional1" optional1value "optional2" optional2value 其中,optional1value是一个整数或字符串等 我们遇到的问题是,双引号没有作为“optional1”参数的一部分传递,因此我相信cm

我试图使用Process.Start(ProcessStartInfo)从c#运行cmd行应用程序

问题是,cmd行应用程序是一个matlab standalone.exe,具有可选参数,这意味着您在cmd行上传递它们,如下所示:

app.exe "optional1" optional1value "optional2" optional2value
其中,optional1value是一个整数或字符串等

我们遇到的问题是,双引号没有作为“optional1”参数的一部分传递,因此我相信cmd.exe会得到如下结果:

app.exe optional1 optional1value optional2 optional2value
或者类似的东西,matlab的解析器显然会被它弄糊涂

我试过:

@"""optional1"" optional1value ""optional2" optional2value"""
正如一些人在关于cmd行参数中双引号的其他SO问题中所建议的,但它似乎对我不起作用,也不:

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

我发现它可能是.NET3.5的cmd解析器中的一个bug,但似乎找不到可行的解决方案

有人有什么想法吗

谢谢你抽出时间

斗篷

还有,当用Process.Start()发送参数时,有没有办法查看cmd.exe得到了什么?我让我的进程打开一个cmd窗口,但如果看到cmd.exe得到的行,比如:“app.exe optional1 optional1value”等,那就太好了


再次感谢。

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

请参阅文档

cmd_app.exe所做的全部工作就是宣布其参数的#和参数是什么,并通过此输入显示:

"optional1"
optional1value
"optional2"
optional2value

你能在声明process对象并调用start方法的地方发布代码片段吗?为什么在optional2value之后加上额外的引号?我认为你的引号在结果中会不平衡。作为一种解决方法:你能在c#程序中添加引号吗?作为一种解决方案,也许可以升级到.NET 4.0?作为另一种解决方法:使所有值都是强制性的,并且使用固定顺序的输入参数?如果您直接运行一个程序,它不会将cmd窗口的标题栏更改为您正在调用的任何对象的完整路径和参数吗?@DennisJaheruddin基于matlab标记,看起来他们正在尝试使用一些可选的命令行参数启动matlab,这些参数是他们尝试使用的命令行参数在值之前,我们需要在选项周围加上引号,这些引号在通过ProcessStartInfo时会被去掉。谢谢你的回复,我会尝试一下,然后很快回复你。啊,看起来这个测试应用程序正在运行!在明天回来工作之前,我无法用matlab脚本尝试,但谢谢你的提示of hope TaRDy:)好吧,我用Matlab代码试过了,但不管出于什么原因,它都不起作用。作为一种解决方法,我们将Matlab代码更改为不使用可选参数,而是使用C#app在不由用户设置的情况下只填充默认值的必需参数。我们现在的问题是,其中一个参数是输入文件的路径,但如果s路径有空格,那么Matlab会将其视为两个独立的参数,因此…我们再次需要引号…这又把它搞砸了。是否有人对使用引号参数运行独立的Matlab.exes有任何问题?
"optional1"
optional1value
"optional2"
optional2value