QProcess::执行环境变量扩展字符串

QProcess::execute Environment Variables Expanded Strings

本文关键字:字符串 扩展 执行 QProcess 环境变量      更新时间:2023-10-16

我如何让它工作:

QProcess::execute("%windir%system32SnippingTool.exe")

我假设扩展的环境变量字符串被 QProcess 忽略了。

我想我需要解析字符串并查看%是否存在,然后获取环境变量以完成完整的字符串路径。听起来很麻烦,应该由QProcess处理。我错过了什么吗?

提前感谢! :)

  • 如果要直接使用 %windir%,可以执行以下操作:
QProcess::execute("cmd.exe /c start /WAIT "" %windir%\system32\SnippingTool.exe");
  • 否则,您可以使用例如qgetenv("windir")qEnvironmentVariable("windir")来获取Windows文件夹路径。

希望对您有所帮助。

感谢@TomKim的回答在他的答案中处理扩展的字符串,我解决了这个问题。不幸的是,空白给我带来了其他问题,使我想出了这个解决方案,希望能帮助其他人。虽然不是最漂亮的解决方案,但它确实是我为多个平台所需要的:

void QuickCut::executeProcess(const std::string & szProc, const std::string & szArgs)
{
    // QProc won't expand environment variable strings.
    // Invoking using the user console will allow for expanded string to work as expected.
#ifdef Q_OS_WIN
    QString szCommand = "cmd /c start "" "" + QString::fromStdString(szProc) + """;
    QString szExt = ".cmd";
#elif Q_OS_UNIX
    QString szCommand = "sh -c '" + QString::fromStdString(szProc) + "'";
    QString szExt = ".sh";
#endif
    QStringList qArgsTmp = QString::fromStdString(szArgs).trimmed().split(",");
    for (auto && arg : qArgsTmp)
    {
        QString argTrimmed = arg.trimmed();
        if (argTrimmed.isEmpty()) continue;
        szCommand += " " + argTrimmed;
    }
    qDebug() << "[QuickCut::executeProcess] - Execute Command: " << szCommand;
    QString szFilePath = applicationDirPath() + "/tempCmd" + szExt;
    QFile file(szFilePath);
    file.open(QIODevice::ReadWrite);
    QTextStream ts(&file);
    ts << szCommand;
    file.close();
    QProcess::execute(szFilePath);
    file.remove();
}