2

我正在编写一个小型 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++ 启动它!

有谁知道这里发生了什么?这让我非常生气!非常感谢您提供的任何帮助或建议。

4

1 回答 1

1

编辑:

我会尝试并建议您两种解决方法:

  1. 您可以将每个空格字符替换为;而不是使用"您的参数。\"要正确进行替换,您必须指定\\"为替换字符串;首先尝试不指定任何参数(仅用于命令名称),看看是否可以扩展它;

  2. 将整个命令行写入批处理文件(似乎您在 Windows 上),然后执行该文件。

还要查看这篇关于 Win32 双引号转义规则的帖子

尝试这个:

system(ExpandEnvironmentVariables("\"" + path + "\" " + arg1 + " -c \\\"").c_str());

注意 3 \:您想将反斜杠传递给 shell(就像在命令行上一样);如果您只转义"一次,shell 会直接接收它,并将其解释为字符串分隔符。你想要的是外壳接收到它转义,因此\\".

于 2012-05-05T09:37:50.280 回答