我有一个运行命令的c ++程序并将一些参数传递给它。代码如下:
int RunApplication(fs::path applicationPathName,std::string arguments)
{
std::string applicationShortPath=GetShortFileName(applicationPathName);
std::string cmd="\""+applicationShortPath +"\" "+ arguments+" >>log.txt 2>&1 \"";
std::cout<<cmd<<std::endl;
int result=std::system(cmd.c_str());
return result;
}
当我运行系统命令时,cmd窗口会很快出现然后关闭,但结果为1且cmd未运行(该命令应生成未生成的输出)。
要检查cmd是否正确,我在系统行之前停止了应用程序,并将cmd内容复制/粘贴到cmd窗口并且它工作正常。
我想知道如何才能找到为什么应用程序不在system()中运行?
cmd在运行之前有这个值:
"D:/DEVELO~3/x64/Debug/enfuse.exe" -w --hard-mask --exposure-weight=1 --saturation-weight=0.328 --contrast-weight=0.164 -o "C:/Users/m/AppData/Local/Temp/1.tif" "C:/Users/m/AppData/Local/Temp/1.jpg" "C:/Users/m/AppData/Local/Temp/2.jpg" >>log.txt 2>&1 "
我怎样才能找到它无效的原因?
我有没有办法设置系统,以便它不关闭cmd窗口,以便我可以检查它?
有没有更好的方法在OS上运行命令?
Boost对此有什么解决方案吗?
使用cmd / k运行后,出现此错误消息:
The input line is too long.
除了减少cmd线以外,我该如何解决?
答案 0 :(得分:1)
这里有两个不同的东西:如果你必须启动一个suprocess,&#34; system&#34;这不是最好的方法(更好地使用适当的API,如CreateProcess
或多平台包装器,但避免通过命令解释器,以避免打开潜在的恶意软件注入)。
但是在这种情况下,system()可能是正确的方法,因为你实际上需要命令解释器(你只能在创建进程的情况下管理>>log.txt 2>&1
之类的东西。)
问题看起来像是被调用程序中的失败:可能是路径不正确,或者它必须使用的某些文件不存在或可以使用适当的权限访问等等。
要做的第一件事:打开一个命令提示符并粘贴你发布的字符串。它运行吗?是否说出任何错误?
要检查的另一件事是如何在C ++文字中使用转义序列:要获得'\'
,您需要'\\'
,因为第一个是第二个转义(如\n
,或\t
等。虽然看起来并非如此,但这是最常见的错误之一。
答案 1 :(得分:0)
使用cmd /k
保留终端:http://ss64.com/nt/cmd.html
或者只是生成cmd.exe
并检查环境,权限等。您可以手动粘贴该命令以查看它是否可以从该shell运行。如果确实如此,你知道路径,权限和环境都可以,所以你手上还有其他问题(参数转义,字符编码问题)
答案 2 :(得分:0)