当前位置: 首页 > news >正文

QProcess 执行脚本和命令

在Qt中经常需要使用 QProcess 来启动一个子进程执行一些命令或启动脚本等操作,常用方案如下:

1、 执行程序和对应参数作为 QString cmdStr

对于将执行程序和对应的参数构建成一个QString时,QProcess是自动将进行拆分,将第一个空格前面的内容作为程序名,后面的作为对应参数,容易出问题。一般会将程序名和各个参数用双引号进行包裹。

Code
    // 函数定义,直接执行对应的cmdbool StartProcess(const QString& cmd, QString& outMsg, QString& errMsg, const QString& workingDir){QProcess process;if (!workingDir.isEmpty()){if (QDir(workingDir).exists()){process.setWorkingDirectory(workingDir);}else{errMsg = QString("Working directory doesn't exist: %1").arg(workingDir);return false;}}process.start(cmd);if (!process.waitForStarted(3000)){errMsg = QString("Process start failed, errMsg = %1").arg(process.errorString());return false;}if (!process.waitForFinished(30000)){errMsg = "Process execution timeout";process.kill();return false;}// 设置编码格式,Windows上cmd执行一般是gbk的编码格式const QTextCodec* codec = QTextCodec::codecForName("gbk");outMsg = codec->toUnicode(process.readAllStandardOutput());errMsg = codec->toUnicode(process.readAllStandardError());QProcess::ExitStatus exitStatus = process.exitStatus();int exitCode = process.exitCode();if (exitStatus == QProcess::NormalExit && exitCode == 0)return true;else{errMsg += QString(" \nProcess failed, exitCode=%1").arg(exitCode);return false;}}// 调用函数bool UnzipFile(const QString& unzipTool, const QString& zipFile, const QString& destDir){if (!QFile::exists(unzipTool) || !QFile::exists(zipFile) || !QDir(destDir).exists())return false;// 构建对应的cmd字串,需要用双引号包裹起来,避免参数中有空格等问题。QString cmd = QString("\"%1\" -o \"%2\" -d \"%3\"").arg(unzipTool).arg(zipFile).arg(destDir);QString workingDir = QFileInfo(unzipTool).absolutePath();QString outMsg, errMsg;bool extRes = StartProcess(cmd, outMsg, errMsg, workingDir);return extRes;}

2、程序名称和参数分开

该方案将程序名称和参数分开,以避免出现解析错误,对应的接口定义和调用案例如下:

Code
    // 功能接口bool StartProcess(const QString& program, const QStringList& arguments, QString& outputMsg, QString& errMsg, bool isUtf8){outputMsg.clear();errMsg.clear();QProcess process;process.start(program, arguments);// 默认等待启动时间if (!process.waitForStarted()){errMsg = process.errorString();return false;}// 最多等待30秒if (!process.waitForFinished(30000)){process.kill();errMsg = "timeout";return false;}if (isUtf8){outputMsg = QString::fromUtf8(process.readAllStandardOutput());errMsg += QString::fromUtf8(process.readAllStandardError());}else{outputMsg = QString::fromLocal8Bit(process.readAllStandardOutput());errMsg += QString::fromLocal8Bit(process.readAllStandardError());}QProcess::ExitStatus exitStatus = process.exitStatus();int exitCode = process.exitCode();return process.exitStatus() == QProcess::NormalExit &&process.exitCode() == 0;}// 调用参数构建QString program = "ping";QStringList args = { "-n", "1", "192.168.0.11"};QString outputMsg, errMsg;bool res = StartProcess(program, args, outputMsg, errMsg);

3、 执行脚本文件batch

直接执行一些脚本文件,需要显示使用cmd.exe,以避免各种问题

// 脚本中为Windows上的命令时,encode="gbk",脚本中的命令为远程Linux命令时,encode="UTF-8" 以避免出现乱码bool StartBatch(const QString& batchPath, QString& out, QString& err, string encode){out.clear();err.clear();if (!QFile::exists(batchPath)){err = "Batch file not found.";return false;}QProcess process;QStringList args;args << "/C" << QDir::toNativeSeparators(batchPath);process.start("cmd.exe", args);// 等待启动(默认30秒)if (!process.waitForStarted()){err = process.errorString();return false;}// 最多等待30秒if (!process.waitForFinished(30000)){process.kill();err = "timeout";return false;}const QTextCodec* codec = QTextCodec::codecForName(encode.c_str());out = codec->toUnicode(process.readAllStandardOutput());err += codec->toUnicode(process.readAllStandardError());return process.exitStatus() == QProcess::NormalExit &&process.exitCode() == 0;}
http://www.jsqmd.com/news/374857/

相关文章:

  • 2026企业知识管理部署推荐:主流厂商、专属服务商、全案方案商齐全 - 品牌2025
  • 基于单片机温控风扇的设计
  • 用过才敢说 AI论文平台 千笔·专业学术智能体 VS 文途AI,继续教育写作更省心!
  • Java计算机毕设之基于java的粮库设备维护管理系统基于springboot的粮库设备管理系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 题解:P14325 [JOI2022 预选赛 R2] 图书馆 2 / Library 2
  • 闲置京东e卡(卡密)回收不用愁!3种常用方法拆解,新手也能轻松变现 - 京回收小程序
  • 5分钟搞定1000套系统巡检!全自动输出可直接上交的 Word 报告
  • 计算机毕业设计之springboot住院部医疗信息管理系统
  • 2026 陕西全屋装修设计甄选指南 五大优质品牌推荐(全包装修实操参考) - 深度智识库
  • JVM参数
  • 2026年全国餐饮酒店设备回收厂家哪家靠谱?适配各类门店与业态需求 - 深度智识库
  • 阳光房遮阳帘常见问题解答:10个核心疑问全解析 - 速递信息
  • 2026年全国餐饮酒店设备回收厂家权威榜单 适配各类酒店餐饮业态 多场景高效处置 - 深度智识库
  • 实用指南:iOS Swift MVVM + RxSwift Generic Rules
  • 计算机Java毕设实战-基于springboot的小学阶段图形化编程竞赛辅导网站设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 港华商会与碳启元合作,为绿色商业发展注入新动力
  • 银川办公楼装修选哪家?本地专注工装老品牌,适配全规模企业需求 - 宁夏壹山网络
  • 计算机Java毕设实战-基于springboot的粮库设备巡检,维修,报修管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 改稿速度拉满!千笔,专科生降AI率首选工具
  • 基于C#和周立功USBCAN设备的完整上位机开发示例
  • 计算机Java毕设实战-基于springboot的停车场收费管理系统设计与实现基于 SpringBoot 的社区物业车位收费管理系统设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 题解:P14167 [Algo Beat Contest 002.5 B] 草莓小蛋糕 (cakes)
  • 从“抽卡“到“导演“——如何构建AI视频生成的母提示词系统
  • 【课程设计/毕业设计】基于springboot的粮库设备维修安检管理系统设计与实现【附源码、数据库、万字文档】
  • 实用指南:如何在mac m1模拟鼠标与键盘的自动化操作
  • 中华老字号药企排行TOP10,广药集团白云山登顶百年匠心榜 - 包罗万闻
  • 2000-2024年地级市环境保护数据-29个指标汇总
  • 新房到别墅装修哪家好:2026最新陕西全屋装修设计公司TOP5推荐 - 深度智识库
  • 深入浅出 SPA/MPA - 指南
  • P7422 「PMOI-2」城市 题解