通过从perl脚本调用的批处理文件设置环境变量

问题描述 投票:0回答:1

让我们考虑以下perl脚本:

#!/usr/bin/perl
system("C:/Program Files (x86)/Microsoft Visual Studio/2017/Enterprise/Common7/Tools/VsDevCmd.bat");
system("msbuild");

使用第一个system调用调用的批处理文件应该设置一些环境变量,以便可以找到第二个system调用中的msbuild可执行文件。

当我运行这个perl脚本时,我收到以下错误:

'msbuild'未被识别为内部或外部命令,可操作程序或批处理文件。

因此,看起来批处理文件中设置的环境变量不可用于perl脚本的上下文。我能做些什么来完成这项工作?

注1

首先从控制台窗口运行批处理文件,然后运行msbuild工作正常。因此批处理文件按预期工作,并且msbuild实际可用。

笔记2

我的真实世界perl脚本要长得多。这个例子是一个大规模的简化,可以重现问题。例如,我不能轻易地用批处理文件替换perl脚本。

注3

有趣的是:我一直使用这个perl脚本一两年没有任何问题。突然间它停止了工作。

perl batch-file console environment-variables command-prompt
1个回答
4
投票
  • 您的进程具有关联的环境,其中包含搜索路径等内容。
  • 当子流程启动时,新流程具有一个新的独立环境,该环境以父流程环境的副本开始。
  • 任何流程(包括子流程)都可以改变自己的环境。但是,他们不能改变父母的过程环境。
  • 运行system()创造了一个新的环境。

因此,当您调用system()来设置环境时,它会启动一个具有新环境的新子流程。然后,您的批处理程序将更改此新环境。但随后子流程退出并且其环境不再存在 - 用它来完成所有的变化。

在运行Perl程序之前,需要在父进程中运行批处理文件。

© www.soinside.com 2019 - 2024. All rights reserved.