Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检索QProcess的环境变量_C++_Qt - Fatal编程技术网

C++ 检索QProcess的环境变量

C++ 检索QProcess的环境变量,c++,qt,C++,Qt,我希望在QProcess中运行环境脚本,然后读取环境(作为QStringList)以使用此环境启动其他脚本 如果我启动env脚本并读取环境,我总是得到一个空的QStringList。有没有办法读出QProcess的环境 我还尝试首先在同一QProcess对象上启动环境脚本和实际脚本,但这也没有帮助。如果您没有使用QProcess的setEnvironment方法,那么空的QStringList就是预期的输出。对于这种情况,QProcess使用程序的环境。为了得到这个 QStringList en

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

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


我还尝试首先在同一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:我为脚本本身编写了一个小解析器,因为我不想更改脚本,但是您的解决方案也可以工作@皮奥特·多布罗戈斯特:我试过了,效果很好!非常感谢。