如何在Windows 上使用std :: system运行带空格的可执行文件而不使用C ++ 11 ?
我已尝试用空格在路径周围放置看似明显的引号,但在弹出运行命令的控制台窗口中,我收到一条消息,指示完整的可执行路径正在空格中分割。例如,我尝试过以下方法:
#include <cstdlib>
int main()
{
int no_spaces_forward_rc = std::system("c:/IronPython2.7/ipy -c \"print 'no_spaces_forward'\"");
// no_spaces_forward_rc is 0 and "no_spaces_forward" is written to console window
int spaces_forward_rc = std::system("\"c:/Program Files (x86)/IronPython 2.7/ipy\" -c \"print 'spaces_forward'\"");
// spaces_forward_rc is 1, and "'c:/Program' is not recognized as an internal or external command, operable program or batch file." is written to console window
int no_spaces_backward_rc = std::system("c:\\IronPython2.7\\ipy -c \"print 'no_spaces_backward'\"");
// no_spaces_backward_rc is 0 and "no_spaces_backward" is written to console window
int spaces_backward_rc = std::system("\"c:\\Program Files (x86)\\IronPython 2.7\\ipy\" -c \"print 'spaces_backward'\"");
// spaces_backward_rc is 1, and "'c:\Program' is not recognized as an internal or external command, operable program or batch file." is written to console window
int no_spaces_double_backward_rc = std::system("c:\\\\IronPython2.7\\\\ipy -c \"print 'no_spaces_double_backward'\"");
// no_spaces_double_backward_rc is 0, and no_spaces_double_backward is written to console window
int spaces_double_backward_rc = std::system("\"c:\\\\Program Files (x86)\\\\IronPython 2.7\\\\ipy\" -c \"print 'spaces_double_backward'\"");
// spaces_double_backward_rc is 1, and "'c:\\Program' is not recognized as an internal or external command, operable program or batch file." is written to console window
int spaces_double_double_backward_rc = std::system("\\\"c:\\\\Program Files (x86)\\\\IronPython 2.7\\\\ipy\\\" -c \"print 'spaces_double_double_backward'\"");
// spaces_dobule_double_backward_rc is 1, and "'\"c:\\Program Files (x86)\\IronPython 2.7\\ipy\"' is not recognized as an internal or external command, operable program or batch file." is written to console window
return 0;
}
我已经确认直接在cmd提示符下运行"c:\Program Files (x86)\IronPython 2.7\ipy" -c "print 'spaces_backward'"
是有效的,而且我很确定我不会有错字。这让我疯了 - 任何帮助都会非常感激!
(我使用Visual Studio 2012并使用子系统控制台进行编译,如果有帮助的话。)
答案 0 :(得分:5)
cmd.exe
的语法有一个令人讨厌的转折。来自cmd.exe /?
:
1. If all of the following conditions are met, then quote characters on the command line are preserved: - no /S switch - exactly two quote characters - no special characters between the two quote characters, where special is one of: &<>()@^| - there are one or more whitespace characters between the two quote characters - the string between the two quote characters is the name of an executable file.
要使行为保持一致,std::system
调用应使用/S
开关,并将命令嵌入引号中。可悲的是,它没有。这意味着这将起作用:
std::system("\"c:\\Program Files (x86)\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe\" h:\\documents\\documentation\\misc\\calendar 1999.pdf");
但这个看似微不足道的变种赢了:
std::system("\"c:\\Program Files (x86)\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe\" \"h:\\documents\\documentation\\misc\\calendar 1999.pdf\"");
要解决此问题,整个命令包括可执行文件的引用路径,必须用引号括起来:
std::system("\"\"c:\\Program Files (x86)\\Adobe\\Reader 10.0\\Reader\\AcroRd32.exe\" \"h:\\documents\\documentation\\misc\\calendar 1999.pdf\"\"");
在您的示例中,那将是
std::system("\"\"c:\\Program Files (x86)\\IronPython 2.7\\ipy\" -c \"print 'spaces_backward'\"\"");
答案 1 :(得分:0)
使用raw string literal确定此代码,实际上适用于我(VS2013 Express):
std::string cmd = R"cmd("C:\Program Files (x86)\doxygen\bin\doxygen.exe")cmd";
system(cmd.c_str());
对于不受支持的原始字符串文字,传统的转义字符串文字应如下所示1:
std::string cmd = "\"C:\\Program Files (x86)\\doxygen\\bin\\doxygen.exe\"";
这些双重转义的原因是system()
实际调用cmd
,它需要双引号"
来封闭命令行来执行。
1)很容易看到,在某处错过\
很容易出错。