如何通过cstdlib系统传递带有空格的参数

5

我有一个Windows控制台应用程序,它接收文件,进行一些计算,然后将输出写入指定的文件。输入是以“app.exe -input fullfilename”格式指定的。我需要从我的C++程序中调用此应用程序,但是路径中的空格会导致问题。当我直接从cmd.exe中调用该应用程序时(为了清晰起见没有指定输出文件),出现了问题。

"c:\first path\app.exe" -input "c:\second path\input.file"

一切都正常工作。但是,当我尝试使用 cstdlib 的 std::system() 函数时,即

std::system(" \"c:\\first path\\app.exe\" -input \"c:\\second path\\input.file\" ");

控制台打印出c:\first不是有效的命令。这可能是一个常见错误,但有简单的解决方法,但我一直找不到。谢谢任何帮助。


你尝试过转义空格吗? - Troubadour
在UNIX系统中,这是shell的责任,它应该可以工作。我不确定在Windows上谁负责此事,但我敢打赌使用MSVC++、MinGW或Cygwin会有所不同。您能告诉我们您正在使用哪个编译器吗? - Ken Bloom
这似乎能工作,但不确定原因:std::system(" \"\"c:\\first path\\app.exe\" -input \"c:\\second path\\input.file\"\" "); - Naveen
Troubadour: 它确实完全一样。 Ken Bloom: MS VS 2008专业版。 Naveen: 是的,这似乎真的很有效,谢谢!但我也不确定。。 - buchtak
Naveen:测试几分钟后出现了另一个问题。虽然您的代码确实有效,但cmd.exe现在抱怨命令的长度。似乎cmd的“命令名称”部分不能超过259个字符,尽管使用参数时允许使用多达8190个字符。外部引号导致命令行被处理为不带参数的单个命令,并且由于指定文件的完整路径,命令长度现在很容易超过允许的最大值259个字符。 - buchtak
2个回答

1

不要使用std::system(),而应该使用Windows API中的_wspawnv函数。如果你想在PATH中搜索程序,而不是指定完整路径,则使用_wspawnvp。

#include <stdio.h>
#include <wchar.h>
...
const WCHAR *app = L"C:\\path to\\first app.exe";
const WCHAR *argv[] = {app, L"-input", L"c:\\second path\\input file.txt"};
_wpspawnv(_P_WAIT, app, argv);

如果您100%确信您的输入文件名永远不会包含除ASCII以外的任何内容,则也可以使用_spawnv / _spawnvp。


0
不要尝试在std::system()调用中放置引号。请尝试以下操作:
std::system("c:\\first\\ path\\app.exe -input c:\\second\\ path\\input.file");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接