C#运行在参数中有多个空格的进程

时间:2018-01-29 14:03:58

标签: c# windows command-line command escaping

我正在尝试启动一个在参数中包含多个空格的进程。传递的参数是动态构建的。例如:

// These three strings will be built dynamically
string consolePath = "C:\\My Path\\nunit3-console.exe"
string dll = "C:\\My Path\\My.Test.dll"
string where = "--where \"test == My.Test.Example \""

string cmdText = $" \"{consolePath }\" \"{dll}\" {where}";
//cmdText = "\"C:\\My Path\\nunit3-console.exe\" \"C:\\My Path\\My.Test.dll\" --where \"test == My.Test.Example \""

var processInfo = new ProcessStartInfo("cmd.exe", $"/c {cmdText}");
processInfo.CreateNoWindow = false;
Process process = Process.Start(processInfo);
process.WaitForExit();
process.Close();

这不起作用,因为第一个空格之外的任何文本都将被忽略。我会收到一条消息,例如'C:\ My'不被识别为内部或外部命令,可操作程序或批处理文件。

我尝试在参数周围添加括号,如here所述,但它没有用。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

您可能需要在单个参数中包含空格的任何内容周围添加另一个双引号。通常,空格表示参数的结尾。因此,为了保留这一点,你必须将字符串放入双引号中。

所以consolePath应该是这样的:

var consolePath = "\"C:\\My Path....exe\"";

答案 1 :(得分:1)

除了之前的回答,@可以用来避免\\这样:

@"""C:\My Path\nunit3-console.exe"""

或:

"\"" + @"C:\My Path\nunit3-console.exe" + "\""

有关此@的更多信息: What's the @ in front of a string in C#?

答案 2 :(得分:0)

经过两天的工作字符串搜索,我终于找到了它。

只需包装这样的字符串:

string Arguments =“ / c “ path”-参数”;

string Arguments = "/c \""path" --argument \"";

注意第一个字符串的粗体引号。