QProcess :: execute Переменные среды Расширенные строки - PullRequest
0 голосов
/ 03 июня 2019

Как мне заставить это работать:

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

Я предполагаю, что строки переменных расширенного окружения игнорируются QProcess.

Я думаю, мне нужнопроанализировать строку и посмотреть, существует ли %, а затем получить переменную среды, чтобы завершить полный путь строки.Звучит как хлопот и что-то, что должно быть обработано QProcess.Я что-то упустил?

Заранее спасибо!:)

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Благодаря @ 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();
}
0 голосов
/ 03 июня 2019
  • Если вы хотите использовать %windir% напрямую, вы можете сделать что-то вроде этого:
QProcess::execute("cmd.exe /c start /WAIT "" %windir%\\system32\\SnippingTool.exe");
  • Иначе, вы можете использовать, например, qgetenv("windir") или qEnvironmentVariable("windir"), чтобы получить путь к папке Windows.

Надеюсь, это поможет вам.

...