qt获取cmd系统指令返回值的三种方法,支持windows和linux

85 篇文章 1 订阅

这里介绍三种不同获取cmd指令的方法,且都支持windows和linux。
方法一(使用QProcess的异步方式来实现):
这里通过QProcess信号槽来实现异步的获取返回值,使用start()来执行才行,如果你用startDetached()执行会把进程分离出去,是无法获取它的状态的。
注意,这里有一个坑,qt无法执行带管道"|“和重定向”>>"的linux指令,需要写入脚本的方式来执行。
这里提供了带管道和不带管道的linux指令执行方法

    //方法一:
    QProcess *p = new QProcess(this);
    connect(p,SIGNAL(finished(int)),this,SLOT(slotFinish(int)));

    ///注意,这里有一个坑,qt无法执行带管道"|"和重定向">>"的linux指令,需要写入脚本的方式来执行。
    ///这里提供了带管道和不带管道的linux指令执行方法
#if 1 //带管道
    QString cmd = "ps -ef|ls -l";
    p->start("bash",QStringList()<<"-c"<<cmd);
#else //不带
    QString cmd = "ls -l";
    p->start(cmd);
#endif

void Widget::slotFinish(int val)
{
    QProcess *p = qobject_cast<QProcess*>(sender());
    qDebug()<<"cmd finish"<<p->readAllStandardOutput();
}

方法二(QProcess同步方式来获取返回值):
waitForStarted()默认30s,设置-1会一直等待执行完毕。

    //方法二:
    QProcess p1;
    ///注意,这里有一个坑,qt无法执行带管道"|"和重定向">>"的linux指令,需要写入脚本的方式来执行。
    ///这里提供了带管道和不带管道的linux指令执行方法
#if 1 //带管道
    QString cmd = "ps -ef|ls -l";
    p1.start("bash",QStringList()<<"-c"<<cmd);
#else //不带
    QString cmd = "ls -l";
    p1.start(cmd);
#endif
    p1.waitForStarted(-1);  //默认30s,设置-1会一直等待执行完毕
    p1.waitForFinished(-1);
    qDebug()<<"cmd finish"<<p1.readAllStandardOutput();

方法三(使用popen的IO接口来实现的):
这里提供两种不同写法。
写法一:

void Widget::executeCMD(const char *cmd, char *result)
{
    char buf_ps[1024];
    char ps[1024]={0};
    FILE *ptr;
    strcpy(ps, cmd);
#ifdef Q_OS_LINUX  //支持LINUX
    if((ptr=popen(ps, "r"))!=NULL)
    {
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
           strcat(result, buf_ps);
           if(strlen(result)>1024)
               break;
        }
        pclose(ptr);
        ptr = NULL;
    }
    else
    {
        printf("popen %s error", ps);
    }
#else      //支持windows系统
    if((ptr=_popen(ps, "r"))!=NULL)
    {
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
           strcat(result, buf_ps);
           if(strlen(result)>1024)
               break;
        }
        _pclose(ptr);
        ptr = NULL;
    }
    else
    {
        printf("popen %s error", ps);
    }
#endif
}

调用方式:

    //方法3
    QString cmd = "ps -ef|ls -l";
    char result[1024];
    executeCMD(cmd.toStdString().data(),result);
    qDebug()<<"cmd finish"<<QString::fromUtf8(result);

写法二:

QString Widget::getCmdResult(const QString &strCmd)
{
    char buf[10240] = {0};
    FILE *pf = NULL;

#ifdef Q_OS_LINUX  //支持LINUX
    if( (pf = popen(strCmd.toStdString().c_str(), "r")) == NULL )
    {
        return "";
    }
#else               //支持windows系统
    if( (pf = _popen(strCmd.toStdString().c_str(), "r")) == NULL )
    {
        return "";
    }
#endif

    std::string strResult;
    while(fgets(buf, sizeof buf, pf))
    {
        strResult += buf;
    }

#ifdef Q_OS_LINUX  //支持LINUX
    pclose(pf);
#else              //支持windows系统
    _pclose(pf);
#endif

    unsigned int iSize =  strResult.size();
    if(iSize > 0 && strResult[iSize - 1] == '\n')
    {
        strResult = strResult.substr(0, iSize - 1);
    }

    return QString::fromLocal8Bit(strResult.c_str());
}

调用方式:

    //方法3
    QString cmd = "ps -ef|ls -l";
    qDebug()<<"cmd finish"<<getCmdResult(cmd);
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方忘忧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值