使用 QProcess 从 C++ 程序中获取 Powershell 的退出代码

问题描述

我想知道是否有人对此问题有答案。
我使用 QProcess 来启动 Powershell 脚本。 QProcess 的启动是从 QThread 发起的。该线程按预期完成,但 QProcess 从不调用readyReadStandardOutput() 信号或 finished() 信号。两者都绑定到 2 个不同的插槽,我可以看到脚本被执行,我也知道脚本以 exitCode 结束。

我的目标基本上是阅读我编写的 Powershell 脚本的退出代码。我尝试了不同的方法,但找不到获取 Powershell 脚本退出代码解决方案,该脚本使用 cstdlib 函数 system() 或 QProcess 运行。所以我决定从标准输出读取它。为此,我会在退出脚本之前简单地打印 $LastExitCode 并从 C++ 程序中读取它。

提前致谢。

编辑:

更新示例:

main.cpp

#include <QtCore/QCoreApplication>
#include <QTextStream>
#include "ManagerClass.h"

int main(int argc,char *argv[])
{
    QCoreApplication a(argc,argv);
    QTextStream wrappedStream(stdin);
    QString scriptPath;
    if (argc < 2)
    {
        std::cout << "Path to script:" << "\n";
        wrappedStream >> scriptPath;
    }
    ManagerClass manager(scriptPath);

    return a.exec();
}

ManagerClass.h

#pragma once

#include <QObject>
#include <QProcess>
#include <iostream>
#include "ExecutionThread.h"

class ManagerClass : public QObject
{
    Q_OBJECT

public:
    ManagerClass(const QString& p_scriptPath,QObject *parent = nullptr);
    ~ManagerClass();

public slots:
    void threadFinished();
    void processstarted();
    void processFinished(int exitCode,QProcess::ExitStatus exitStatus);

private:
    ExecutionThread m_thread;
    const QString SCRIPT_PATH;
};

ManagerClass.cpp

#include "ManagerClass.h"

ManagerClass::ManagerClass(const QString& p_scriptPath,QObject* parent)
    : QObject(parent),SCRIPT_PATH(p_scriptPath)
{
    m_thread.getProcesspointer();
    m_thread.registerScriptPath(p_scriptPath);
    QObject::connect(m_thread.getProcesspointer(),QOverload<int,QProcess::ExitStatus> ::of(&QProcess::finished),this,&ManagerClass::processFinished);
    QObject::connect(m_thread.getProcesspointer(),&QProcess::started,&ManagerClass::processstarted);
    QObject::connect(&m_thread,&ExecutionThread::finished,&ManagerClass::threadFinished);
    m_thread.start();
}

ManagerClass::~ManagerClass() {}

void ManagerClass::processFinished(int exitCode,QProcess::ExitStatus exitStatus)
{
    std::cout << " Process finished successfully." << "\n";
    std::cin.get();
}

void ManagerClass::threadFinished()
{
    std::cout << " Thread finished successfully." << "\n";
}

void ManagerClass::processstarted()
{
    std::cout << " Process started." << "\n";
}

执行线程.h

#pragma once

#include <QThread>
#include <QProcess>
#include <iostream>

class ExecutionThread : public QThread
{
    Q_OBJECT

public:
    ExecutionThread();
    ~ExecutionThread();

    void run();
    void registerScriptPath(const QString& p_scriptPath);
    QProcess* getProcesspointer();

signals:
    void finished();

private:
    QProcess* m_Process;
    QString m_scriptPath;
};

ExecutionThread.cpp

#include "ExecutionThread.h"

ExecutionThread::ExecutionThread() : m_Process(new QProcess) {}

ExecutionThread::~ExecutionThread()
{
    std::cout << "ExecutionThread::~ExecutionThread()";
}

void ExecutionThread::run()
{
    QStringList commands;
    m_Process->start(m_scriptPath,commands);
    emit finished();
}

void ExecutionThread::registerScriptPath(const QString& p_scriptPath)
{
    m_scriptPath = p_scriptPath;
}
QProcess* ExecutionThread::getProcesspointer()
{
    return m_Process;
}

编辑: 我解决了我面临的问题,总是将 1 作为退出代码。 事实证明,我误解了 QProcess 的 Qt API。 当它完成时,我仍然没有从那个 QProcess 对象得到信号。 上面的示例使用 m_Process->start() 并且在给定的 powershell 脚本完成时没有信号。如前所述,m_Process->execute() 也不会发出任何信号。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)