我有一个运行命令并向其传递一些参数的 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 行之外,我该如何修复它?
最佳答案
这里有两件事:如果你必须启动一个 suprocess,“系统”不是最好的方法(最好使用适当的 API,如 CreateProcess
,或多平台包装器,但避免通过命令解释器,以避免打开潜在的恶意软件注入(inject))。
但在这种情况下,system() 可能是正确的方法,因为您实际上需要 命令解释器(您无法管理诸如 >>log.txt 2>&1
仅创建一个进程。)
问题看起来像是被调用程序中的一个故障:可能是路径不正确或者它必须使用的某些文件不存在或无法通过适当的权限访问等等。
要做的第一件事之一是:打开命令提示符并将您发布的字符串粘贴到其中。它运行吗?它是否说明了任何错误?
要检查的另一件事是如何在 C++ 文字中使用转义序列:要获得 '\'
,您需要 '\\'
,因为第一个是转义序列对于第二个(如 \n
或 \t
等)。虽然看起来并非如此,但在这里,这是最常见的错误之一。
关于c++ - 我如何找到系统无法运行我的应用程序的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26176172/