我正在编写一个小的C ++程序,它涉及启动带有许多参数的.exe进程,包括发送包含空格的路径,因此需要在路径周围使用双引号。我记得使用过“逃脱角色”。
我已经尝试了很多不同的方法来启动这个过程,所以最终在system(),只是为了尽量使起始代码尽可能简化。
我有这段代码:
string ExpandEnvironmentVariables(string input)
{
char buffer[512];
ExpandEnvironmentStringsA(input.c_str(), buffer, sizeof(buffer) / sizeof(*buffer));
return buffer;
}
据我所知,它可以正常工作。
这是我用来启动进程的代码(所有变量都是std :: string)。这个工作正常,但它不包含我想传递的所有参数。
system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c ").c_str());
这个不起作用:
system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \"").c_str());
请注意添加额外的双引号。这不是过程错误,而是过程从未启动过程。
我正在使用Process Monitor来检测进程何时启动,并且只要在其中添加额外的双引号就不会出现process.exe。但是,这是我想要开始的过程(也不起作用)
system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \"" + arg2 + "\"" + arg3 + arg4 + " " + arg5 + arg6 + " " + arg6 + "\\" + arg7).c_str());
我甚至试图配对双引号,但这也不起作用:
system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \"test\"").c_str());
最后,我担心长度。添加第三个双引号就是打破它的原因。但是,在此之前,长度为134个字符。但是,我希望实际的启动例程长度为346个字符。这不是太久了,是吗???
我可以调试程序,获取格式化的字符串,然后粘贴到命令提示符中,并且过程完美启动。使用这些额外的引号,它的格式完美。但我无法通过C ++开始!
有谁知道这里发生了什么?这让我非常生气!非常感谢您提供任何帮助或建议。
答案 0 :(得分:1)
编辑:
我会尝试建议你两个解决方法:
而不是在您的参数周围使用"
,您可以用\"
替换每个空格字符;要正确地进行替换,您必须指定\\"
作为替换字符串;首先尝试它而不指定任何参数(仅用于命令名称),并查看是否可以扩展它;
将整个命令行写入批处理文件(好像你在Windows上),然后执行该文件。
另请查看此post about Win32 double-quote escaping rules。
试试这个:
system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \\\"").c_str());
注意3 \
:你想将反斜杠传递给shell(就像在命令行中一样);如果你只转义"
一次,那么shell会接收它,并将其解释为字符串分隔符。你想要的是shell接收它进行转义,因此在\
前面加倍\"
。