我想在QProcess中运行环境脚本,然后读取环境(作为QStringList)以使用此环境启动其他脚本。
如果我启动env脚本并读取环境,我总是得到一个空的QStringList。有没有办法读出QProcess的环境?
我还尝试首先启动环境脚本并在同一个QProcess对象上启动实际脚本,但这也没有帮助。
答案 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,并且需要在调用它们之后捕获完整的环境(单独):
call ...\vc\vcvarsall.bat call may\be\another.cmd echo {5c131c2a-405b-478a-8279-9dff52c31537} set
QProcess
运行脚本后,我使用readAllStandardOutput()
来收集所有输出。QProcessEnvironment
中(如前所述),并且可以将其应用于新进程或进行其他修改。