C++ 检索QProcess的环境变量
我希望在QProcess中运行环境脚本,然后读取环境(作为QStringList)以使用此环境启动其他脚本 如果我启动env脚本并读取环境,我总是得到一个空的QStringList。有没有办法读出QProcess的环境C++ 检索QProcess的环境变量,c++,qt,C++,Qt,我希望在QProcess中运行环境脚本,然后读取环境(作为QStringList)以使用此环境启动其他脚本 如果我启动env脚本并读取环境,我总是得到一个空的QStringList。有没有办法读出QProcess的环境 我还尝试首先在同一QProcess对象上启动环境脚本和实际脚本,但这也没有帮助。如果您没有使用QProcess的setEnvironment方法,那么空的QStringList就是预期的输出。对于这种情况,QProcess使用程序的环境。为了得到这个 QStringList en
我还尝试首先在同一QProcess对象上启动环境脚本和实际脚本,但这也没有帮助。如果您没有使用QProcess的setEnvironment方法,那么空的QStringList就是预期的输出。对于这种情况,QProcess使用程序的环境。为了得到这个
QStringList env(QProcess::systemEnvironment());
应该工作。
< P>如果你能重写C++中设置环境的脚本,你可以自己创建环境并使用设置它。 方法,如方法文档中给出的示例所示:
QProcess process;
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
env.insert("TMPDIR", "C:\\MyApp\\temp"); // Add an environment variable
env.insert("PATH", env.value("Path") + ";C:\\Bin");
process.setProcessEnvironment(env);
process.start("myapp");
更新
如果你不能使用上述方法,你可以像这样使用cmd.exe
#include <QtCore/QCoreApplication>
#include <QtCore/QProcess>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QProcess* proc = new QProcess();
proc->start("cmd.exe /c \"call env.bat && script.bat\"");
return app.exec();
}
和script.bat中包含此内容
set abc=test
echo %abc% > a.txt
test
运行上述命令将创建一个包含此内容的.txt文件
set abc=test
echo %abc% > a.txt
test
您可以通过以下方式(到标准调试输出窗口)以更好的格式读取QProcess中设置的所有环境变量。它将在新行中打印每个变量
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
qDebug() << "All variables";
QString env_variable;
QStringList paths_list = env.toStringList();
foreach( env_variable, paths_list )
qDebug() << env_variable;
QProcessEnvironment env=QProcessEnvironment::systemEnvironment();
qDebug()另一种不用解析外部文件即可完成的方法;在我的例子中,我需要从不同的msvc版本执行vcvarsall.bat,并且需要在调用它们(单独)后捕获完整的环境:
我在磁盘上写了一个.cmd脚本,它调用任何修改环境的东西李>
。。。cmd脚本的最后一行只是“set”
即
使用QProcess
运行脚本后,我使用readAllStandardOutput()
收集所有输出
无论输出包含什么,在用作锚定的guid处拆分后,其余的只是之前调用创建的完整环境
。。。现在,我可以将它作为key=value部分逐行解析,并将它们插入到新的QProcessEnvironment
(如前所述),并可以将其应用到新流程中
听起来您可能想使用QProcessEnvironment
来完成您的尝试。一些代码片段可能会澄清您的实现中的问题。好的,一些代码:[code]void runScript(const QString&envScript,const QString&script){QProcess*proc=new QProcess();proc->start(envScript);//包含类似“set ENV_VAR=“ENV”proc->waitForFinished();proc->start(script)的内容;//我希望环境脚本中的环境仍然设置,但它不是}[/code]这将返回调用者的环境(启动QProcess的qt程序)。在启动环境脚本后,我需要QProcess的环境。@Nick:你说的“环境脚本”是什么意思"? 您的QProcess是shell吗?它是一个批处理文件,如:set TMP_DIR=“…”set REP_ACTIVE=“…”
实际脚本启动需要设置此环境的其他进程谢谢,但不幸的是,这不起作用,因为脚本是由生成管理系统自动生成的,并且可以随时更改。我可以尝试解析文件并找到变量,但这并不容易,因为脚本可以包含“if-else”语句等@Nick:将脚本的最后一行“printenv
”,然后解析其输出,而不是脚本本身。感谢您的帮助@Ben Voigt:我为脚本本身编写了一个小解析器,因为我不想更改脚本,但是您的解决方案也可以工作@皮奥特·多布罗戈斯特:我试过了,效果很好!非常感谢。