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();
}
如何让它工作:
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();
}