【问题标题】:Query with QProcess使用 QProcess 查询
【发布时间】:2023-06-30 15:23:01
【问题描述】:

我应该检查服务是否为RUNNING。我在执行以下查询时遇到了QProcess 查询执行问题:SC QUERY "service name" | findstr RUNNING,尽管当直接在 Windows 的命令行中执行时这工作正常。这里的代码片段如下:

    QProcess process;
    process.setProcessChannelMode(QProcess::ForwardedChannels);
    process.start("SC QUERY \"Service_name\" | findstr RUNNING", QIODevice::ReadWrite);


    // Wait for it to start
    if(!process.waitForStarted())
        return 0;

    QByteArray buffer;
    while(process.waitForFinished())
        buffer.append(process.readAll());
    qDebug() << buffer.data();

输出为:

你能帮帮我吗?

【问题讨论】:

  • 究竟是什么问题?您是否检查了对象的 stdout/err 以及 errorString()?另外,请出示您的代码!
  • 它不执行它,而是参考帮助命令
  • 请展示您的代码您尝试如何使用它。你确定你的管道正确吗?您正在使用哪个 Qt,以防万一等?检查这个:doc-snapshot.qt-project.org/qdoc/…

标签: c++ qt pipe qtcore qprocess


【解决方案1】:

这是因为使用这三行不会给你预期的结果:

QProcess process;
process.setProcessChannelMode(QProcess::ForwardedChannels);
process.start("SC QUERY \"Service_name\" | findstr RUNNING", QIODevice::ReadWrite);

基于official documentationQProcess 应该适用于管道命令:

void QProcess::setStandardOutputProcess(QProcess * 目的地)

将此进程的标准输出流通过管道传输到目标进程的标准输入。

也就是说command1 | command2shell命令命令可以通过以下方式实现:

QProcess process1;
QProcess process2;

process1.setStandardOutputProcess(&process2);

process1.start("SC QUERY \"Service_name\"");
process2.start("findstr RUNNING");
process2.setProcessChannelMode(QProcess::ForwardedChannels);

// Wait for it to start
if(!process1.waitForStarted())
    return 0;

bool retval = false;
QByteArray buffer;
while ((retval = process2.waitForFinished()));
    buffer.append(process2.readAll());

if (!retval) {
    qDebug() << "Process 2 error:" << process2.errorString();
    return 1;
}

qDebug() << "Buffer data" << buffer;

【讨论】:

  • 谢谢你回答Laszlo,但是没有输出?
  • @elgolondrino:你在控制台中得到输出吗?如果有任何错误,你检查过 errorString() 吗?
  • 没有错误输出只是一个空的(QByteArray)缓冲区
  • @LaszloPapp 我觉得你应该加process2.setProcessChannelMode(QProcess::ForwardedChannels);,否则第二个进程的输出不会显示出来。
  • @elgolondrino:尝试添加我从您的原始代码中使用的单行代码。那它有用吗?