C# Process Start 需要带双引号的参数 - 它们消失了

Posted

技术标签:

【中文标题】C# Process Start 需要带双引号的参数 - 它们消失了【英文标题】:C# Process Start needs Arguments with double quotes - they disappear 【发布时间】:2012-12-29 16:01:23 【问题描述】:

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

问题是,cmd 行应用程序是一个 matlab 独立 .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 会打印不带任何双引号的参数。

我发现 this article 可能是 .NET 3.5 的 cmd 解析器中的一个错误,但似乎找不到可行的解决方案。

有人有什么想法吗?

感谢您的宝贵时间,

斗篷

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

再次感谢。

【问题讨论】:

能把sn-p的代码贴在声明流程对象并调用start方法的地方吗? 为什么 optional2value 后面有多余的引号?我认为您的报价在结果中会不平衡。 作为一种解决方法:您可以在 c# 程序中添加引号吗?作为解决方案,也许升级到 .NET 4.0 ?作为另一种解决方法:强制所有值并使用固定的输入参数顺序? 如果您直接运行程序,它不会将 cmd 窗口的标题栏更改为您正在调用的任何内容的完整路径和参数吗? @DennisJaheruddin 基于matlab标签,看起来他们正在尝试使用一些可选的命令行参数启动matlab,他们试图传递的命令行参数需要在值之前的选项周围加上引号这些引号在通过 ProcessStartInfo 时被剥离 【参考方案1】:

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

请参阅文档here。

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

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

"optional1"
optional1value
"optional2"
optional2value

【讨论】:

感谢您的回复,我会尝试一下并尽快回复您。 啊,这似乎与测试应用程序一起工作!在我明天回来工作之前,我无法使用 matlab 脚本进行尝试,但感谢 TaRDy 带来的一线希望 :) 好的,我用 Matlab 代码试过了,不管什么原因它都不起作用。作为一种解决方法,我们将 Matlab 代码更改为不使用可选参数,而是使用必需参数,如果用户未设置,C# 应用程序只会使用默认值填充。我们现在的问题是,其中一个参数是输入文件的路径,但如果这个路径有空格,那么 Matlab 会将其视为 2 个单独的参数,因此......我们再次需要引号......这又把它弄乱了向上。有没有人在运行带有引用参数的独立 Matlab .exe 时遇到任何问题?

以上是关于C# Process Start 需要带双引号的参数 - 它们消失了的主要内容,如果未能解决你的问题,请参考以下文章

C# process.Start 文件名和传递参数

Inno Setup, Pascal 字符串带双引号如何写

带双引号的 CSV 的无效引号格式(Redshift 加载)

C# 中的 Process.Start 与 Process `p = new Process()`?

在awk中搜索带双引号的字符串

带双引号的 PHP/SQL 准备语句