【问题标题】:execute batch-file with qt as a new process使用 qt 作为新进程执行批处理文件
【发布时间】: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

标签: c++ qt c++11 batch-file qprocess


【解决方案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))
    

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

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多