C#使用c#过程CMD与引号(")混淆

CMD is confused with quotation marks (") using c# process

我有一个命令,它被传送到要执行的cmd。

string command = @"C:\Privat\Docs\programm.exe" + " " + "-k" + " " + "https://thisIsAnUrl/DoIt=" + argument;

参数必须如下所示:\"xx:xx:xx:xx\"

当我用这个命令执行它时,我会得到输出
C:\Privat\Docs\programm.exe -k https://thisIsAnUrl/DoIt=\"xx:xx:xx:xx\" 这就像我想要的那样工作。

问题是:当目录包含 space (C:\Privat\Do cs\programm.exe) 时,您需要在目录中添加引号:

string command = @"""C:\Privat\Do cs\programm.exe""" + " " + "-k" + " " + "https://thisIsAnUrl/DoIt=" + argument;

然后输出变为 "C:\Privat\Do cs\programm.exe" -k https://thisIsAnUrl/DoIt=\"xx:xx:xx:xx\",如果我直接在 cmd 中执行它,它工作正常,但是如果我使用此代码通过 c# 调用 cmd,我会收到一个错误,指出该命令是错误编写的或未找到(尽管它是正确的,当我准确复制此输出并且如我所说,直接使用 cmd 执行它时它工作正常)。

cmd混淆的是xx:xx:xx:xx前后的\"但是命令留下它们是必不可少的

我错过了什么?请帮助

我建议通过在 want/have 要转义的字符前添加 ^ 来转义引号,如下面 link 中所述。

查看更多:Escape double quotes in parameter

更新

直接在您认为会产生问题的反斜杠 \ 之前尝试,因此有点像这样:^\"xx:xx:xx:xx^\"。如果这不起作用,请尝试像这样转义双引号:^\^"xx:xx:xx:xx^\^"。或者第三个选项:只转义双引号:\^"xx:xx:xx:xx\^"

更新 2

由于评论中接受了这一点,请执行以下操作:使您的代码如下所示:

+ " " + "\"https://thisIsAnUrl/DoIt=\"" + argument;

我认为您可能只需要在调用新进程时分别设置 FilenameArguments 属性。

这是我用来执行 cmd.exe 的一些 C# 代码(注意这里使用的 /c 参数和周围的附加引号)。

string cmd7z = @"C:\Program Files-zipz.exe";
string filename = "filetodecompress.bz2";

var processDecompress = new Process()
{
    StartInfo = new ProcessStartInfo()
    {
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        UseShellExecute = false,
        CreateNoWindow = true,
        FileName = "cmd.exe",
        Arguments = $"/c \"\"{cmd7z}\" e -so \"{filename}\"\""
    }
};

processDecompress.Start();
processDecompress.WaitForExit();
int returnCode = processDecompress.ExitCode;

关于在 c# 中转义命令行参数的 post 可能会解决您的问题。

其中包含有关 .NET 如何处理命令行参数的转义序列的详细说明和一些示例。