使用QProcess进行查询

时间:2013-12-26 12:29:15

标签: c++ qt pipe qtcore qprocess

我应该检查服务是否为RUNNING。我遇到QProcess查询执行问题,执行以下查询时遇到问题:SC QUERY "service name" | findstr RUNNING,虽然在Windows中直接在命令行中执行时可以正常工作。代码snipet如下:

    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();

输出为:enter image description here

你能帮帮我吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

  

void QProcess :: setStandardOutputProcess(QProcess * destination)

     

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

换句话说,command1 | command2 shell命令命令可以通过以下方式实现:

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;
相关问题