检索QProcess的环境变量

时间:2011-02-17 18:15:57

标签: c++ qt

我想在QProcess中运行环境脚本,然后读取环境(作为QStringList)以使用此环境启动其他脚本。

如果我启动env脚本并读取环境,我总是得到一个空的QStringList。有没有办法读出QProcess的环境?

我还尝试首先启动环境脚本并在同一个QProcess对象上启动实际脚本,但这也没有帮助。

4 个答案:

答案 0 :(得分:4)

如果您能够重写用C ++设置环境的脚本,您可以自己创建环境并使用
设置它 void QProcess::setProcessEnvironment ( const QProcessEnvironment & environment ) 方法文档中给出的示例中的方法:

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

env.bat包含此内容

set abc=test

和带有此内容的script.bat

echo %abc% > a.txt

运行上述内容会创建包含此内容的a.txt文件

test 

答案 1 :(得分:1)

如果您还没有使用过QProcess的setEnvironment方法,那么空的QStringList就是预期的输出。对于这种情况,QProcess使用程序的环境。为此,

QStringList env(QProcess::systemEnvironment());

应该有用。

答案 2 :(得分:0)

您可以通过以下方式以更好的格式读取QProcess中设置的所有环境变量(到标准调试输出窗口)。它将在新行中打印每个变量。

QProcessEnvironment env = QProcessEnvironment::systemEnvironment();

qDebug() << "All variables";

QString env_variable;
QStringList paths_list = env.toStringList();

foreach( env_variable, paths_list )
    qDebug() << env_variable;

答案 3 :(得分:0)

在不解析外部文件的情况下完成它的另一种方法;在我的情况下,我需要从不同的msvc版本执行vcvarsall.bat,并且需要在调用它们之后捕获完整的环境(单独):

  1. 我将.cmd脚本写入磁盘,调用任何修改环境的内容;
  2. ... cmd脚本的最后一行只是“设置” 即
    call ...\vc\vcvarsall.bat
    call may\be\another.cmd
    echo {5c131c2a-405b-478a-8279-9dff52c31537}
    set
    
  3. 在使用QProcess运行脚本后,我使用readAllStandardOutput()来收集所有输出。
  4. 无论输出包含什么,在将它作为锚点用于guid之后,其余部分就是之前调用创建的完整环境
  5. ...现在我可以逐行解析它作为键=值部分并将它们插入到新的QProcessEnvironment中(如前所述),并且可以将其应用于新进程或进行其他修改。