使用 qt 作为新进程执行批处理文件

Posted

技术标签:

【中文标题】使用 qt 作为新进程执行批处理文件【英文标题】:execute batch-file with qt as a new process 【发布时间】:2018-08-08 07:04:28 【问题描述】:

我正在尝试执行一个批处理文件。

这段代码应该在一个分离的进程中启动cmd.exe并执行deleteme.batexec->startDetached的返回值为true,但是批处理文件没有被执行。

我做错了吗?

这是我的代码:

QStringList arguments;
arguments << "/C deleteme.bat";
QProcess * exec = new QProcess();
exec->startDetached("cmd.exe", arguments);

【问题讨论】:

你怎么确定它没有运行? 文件应自行删除 (del deleteme.bat)。如果我直接执行它就可以了。但它不适用于这些代码行。 @eyllanesc 你可以显示.bat的内容。此外,如果未通过放置完整路径进行测试,.bat 位于 .exe 的一侧。 bat 文件只包含一行 (del deleteme.bat) 以检查它是否正常工作。它与exe在同一目录中。 试试del /path/of/deleteme.bat 【参考方案1】:

这是一个使用QProcess 的工作示例(测试.bat 文件的路径是E:\deleteme.bat):

QProcess process;
process.setProgram( "cmd.exe" );
process.setArguments(  "/C", R"(E:\deleteme.bat)"  );
process.setWorkingDirectory( R"(E:\)" );
process.setStandardOutputFile( QProcess::nullDevice() );
process.setStandardErrorFile( QProcess::nullDevice() );
process.startDetached();

这是自删除自身的deleteme.bat 文件:

DEL "%~f0"

【讨论】:

【参考方案2】:

我自己找到了解决办法。

STARTUPINFO si =  sizeof(STARTUPINFO) ;
PROCESS_INFORMATION pi;

wchar_t cmdline[] = L"cmd.exe /C <batch-file>";

if (!CreateProcess(NULL, cmdline, NULL, NULL, false, CREATE_UNICODE_ENVIRONMENT,
    NULL, NULL, &si, &pi))

这也会创建一个分离的进程。

【讨论】:

以上是关于使用 qt 作为新进程执行批处理文件的主要内容,如果未能解决你的问题,请参考以下文章

创建新进程并传递对象

Windows CMD 批处理脚本 FFmpeg

如何等待进程终止以在批处理文件中执行另一个进程

CMake 对测试源的处理方式不同吗?

使用 QProcess 在 Qt 中运行外部可执行文件

QProcess 终止进程树