【问题标题】:QProcess::execute Environment Variables Expanded StringsQProcess::execute 环境变量扩展字符串
【发布时间】:2019-06-03 17:46:17
【问题描述】:

如何让它工作:

QProcess::execute("%windir%\system32\SnippingTool.exe")

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

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

提前致谢! :)

【问题讨论】:

  • 你可能想看看QProcessEnvironment
  • 谢谢,但我已经尝试过使用QProcessEnvironment 并没有解决我的问题,即当系统使用自定义环境变量时。

标签: c++ qt qprocess


【解决方案1】:
  • 如果你想直接使用%windir%,你可以这样做:
QProcess::execute("cmd.exe /c start /WAIT "" %windir%\\system32\\SnippingTool.exe");
  • 否则,您可以使用例如qgetenv("windir")qEnvironmentVariable("windir") 来获取Windows 文件夹路径。

希望对你有帮助。

【讨论】:

  • 创意!谢谢汤姆! :)
  • 抱歉跳到另一个问题,但你知道为什么当命令包含空格时它不起作用吗? QString szCommand = "cmd /c start \"\" \"" + QString::fromStdString(szProc) + "\""; 看起来如果我从命令提示符启动完全相同的命令,它就可以工作,所以我猜这与 QProcess 有关系。
  • 我为此找到的唯一解决方法(但丑陋)是使用命令字符串,以.bat/.cmd 脚本文件的形式写入磁盘,并使用 QProcess 执行它,然后删除该文件。这行得通,但做事的方式相对奇怪。 ://
  • 试试这个:QString szCommand = "cmd /c \"start \"\" \"+ QString::fromStdString(szProc) +\"\"";
  • /Wait 参数在这里很重要。如果你想QProcess::execute做他的工作,即:启动并等待一个程序/命令的结束,你需要添加/Wait
【解决方案2】:

感谢@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();
}

【讨论】:

  • 可能出于安全考虑,您应该使用它来添加您的参数:szCommand += " \"" + argTrimmed + "\"";。防止包含空格的参数
猜你喜欢
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多