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;
我认为您可能只需要在调用新进程时分别设置 Filename
和 Arguments
属性。
这是我用来执行 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 如何处理命令行参数的转义序列的详细说明和一些示例。
我有一个命令,它被传送到要执行的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;
我认为您可能只需要在调用新进程时分别设置 Filename
和 Arguments
属性。
这是我用来执行 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 如何处理命令行参数的转义序列的详细说明和一些示例。