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之前和之后",但命令必须将它们保留为
我错过了什么?请帮助
我建议通过在您想要/必须转义的字符之前添加^
来转义引号,如下链接所述。
查看更多:参数中的双引号转义
更新
只需直接在反斜杠'
之前尝试它,您认为这会产生问题,因此不知何故如下:^'"xx:xx:xx:xx^'"
。如果这不起作用,也可以尝试转义像这样的双引号:^'^"xx:xx:xx:xx^'^"
。或者第三种选择:只需转义双引号:'^"xx:xx:xx:xx'^"
更新2
既然这在评论中被接受了,请执行以下操作:使您的代码看起来像这样:
+ " " + "'"https://thisIsAnUrl/DoIt='"" + argument;
我认为在调用新进程时,您可能只需要分别设置Filename
和Arguments
属性。
下面是我用来执行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如何处理命令行参数的转义序列的详细解释和一些示例。