QProcess::execute 环境变量扩展字符串

QProcess::execute Environment Variables Expanded Strings

如何让它工作:

QProcess::execute("%windir%\system32\SnippingTool.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();
}