qt - 如何在 Qt5 中执行 .cmd 填充
问题描述
如何使用以下命令执行 .cmd 文件:
TASKKILL /F /PID 14364
MOVE /Y "C:/Users/BBCCA/AppData/Roaming/DWAKU2\DWAKU2.exe" "D:/DWAKU2/build- DWAKU2-Desktop_Qt_5_15_2_MinGW_64_bit_Static-Release/release"
START "" "D:/DWAKU2/build-DWAKU2-Desktop_Qt_5_15_2_MinGW_64_bit_Static-Release/release/DWAKU2.exe"
如何在 qt 中使用命令控制台执行此脚本?
如您所见 - 第一个命令关闭 qt 应用程序。
首先,我尝试使用 QProcess 执行其中的所有命令。
auto programmName = QFileInfo(QCoreApplication::applicationFilePath()).fileName();
QProcess consola;
QString command = "cmd";
QStringList commandArgs;
QString subcommand1, subcommand2;
subcommand1 += "TASKKILL /IM ";
subcommand1 += programmName;
subcommand2 += "DEL /Q ";
subcommand2 += QCoreApplication::applicationFilePath();
commandArgs << "/c" << subcommand1 << "&&" << subcommand2;
qDebug() << commandArgs;
consola.startDetached(command, commandArgs);
consola.waitForFinished();
但它不会执行错误:
Ошибка: Неправильный параметр или аргумент - '/Q'。Введите "TASKKILL /?" для получения справки по использованию。
翻译:
错误:参数或参数不正确 - '/Q'。输入“TASKKILL /?” 有关如何使用它的帮助。
经过大量阅读文档并询问 ru.stuckoverflow - 放弃了这个想法并尝试使用 cmd 文件。
你可以在上面阅读。
该文件的执行是:
// Make updater script
if (fileCorrect){
ui->LoadingAnimationLabel->setText(bLText + "Making updater script... " + aLText);
QFile file(appDataPath + QDir::separator() + "updater.cmd");
if (file.open(QIODevice::WriteOnly)) {
auto pid = "TASKKILL /F /PID " + QString::number(QCoreApplication::applicationPid()) + "\r\n";
auto move = "MOVE /Y \"" + appDataPath + QDir::separator() + QFileInfo(QCoreApplication::applicationFilePath()).fileName() + "\" \"" + QCoreApplication::applicationDirPath() + "\"\r\n";
auto start = "START \"\" \"" + QCoreApplication::applicationFilePath() + "\"\r\n";
file.write(pid.toLocal8Bit());
file.write(move.toLocal8Bit());
file.write(start.toLocal8Bit());
} else fileCorrect = false;
file.close();
}
// Installing updates
if (fileCorrect){
ui->LoadingAnimationLabel->setText(bLText + "Installing update files... " + aLText);
auto command = appDataPath + QDir::separator() + "updater.cmd";
QProcess updater;
updater.startDetached(appDataPath + QDir::separator() + "updater.cmd");
}
当程序执行此文件时 - 仅执行了第一个命令。
但是当我试图通过单击它来执行这个文件时 - 它工作得很好......
解决方案
看一看QProcess
,特别是startDetached
方法。根据文档,“如果调用进程退出,分离的进程将继续运行而不受影响。”
QProcess *myProcess = new QProcess();
myProcess->setProgram("updater.cmd");
myProcess->startDetached();
推荐阅读
- amazon-web-services - 配置 Cloudformation 以使用 Cloudfront 和 S3 对 GET /subdirectory 服务 /subdirectory/index.html 的请求
- jquery - FlexSlider 不加载任何属性(幻灯片、动画、循环)
- react-admin - 列表组件的无限滚动
- javascript - 通过选择下拉列表的 JavaScript 排序表
- mysql - MySQL Workbench:“SELECT”在此服务器版本的此位置无效,预期:'(',有错误
- sql - SSIS执行存储在表的列中的sql命令
- javascript - 在创建 Vue 组件期间使用扩展运算符
- java - Android 应用程序是否可以使用来自另一个应用程序的数据?
- c# - 即使没有对包的引用,也需要 Nuget 包
- c++ - Shamir Secret Sharing 中的模数和反模数问题