CMD与使用c#过程的引号(“)混淆

本文关键字:混淆 过程 CMD | 更新日期: 2023-09-27 17:58:03

我有一个命令,它被传递给要执行的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'"它正在像我想要的那样工作。

问题是:当目录包含空格(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之前和之后",但命令必须将它们保留为

我错过了什么?请帮助

CMD与使用c#过程的引号(“)混淆

我建议通过在您想要/必须转义的字符之前添加^来转义引号,如下链接所述。

查看更多:参数中的双引号转义

更新

只需直接在反斜杠'之前尝试它,您认为这会产生问题,因此不知何故如下:^'"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'7-zip'7z.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#中转义命令行参数的文章可能会解决您的问题。

它包含关于.NET如何处理命令行参数的转义序列的详细解释和一些示例。