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

时间:2018-09-06 08:58:51

标签: perl batch-file console environment-variables command-prompt

让我们考虑以下perl脚本:

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

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

运行此perl脚本时,出现以下错误:

  

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

因此,似乎批处理文件中设置的环境变量不可用于perl脚本的上下文。我该怎么做才能使这项工作成功?

注释1

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

注释2

我的实际perl脚本要长得多。这里的示例非常简化,可以重现该问题。因此,例如,我无法轻松地用批处理文件替换perl脚本。

注释3

有趣的是:我已经使用这个Perl脚本一两年了,没有任何问题。然后突然停止了工作。

1 个答案:

答案 0 :(得分:4)

  • 您的流程具有一个关联的环境,其中包含诸如搜索路径之类的东西。
  • 子流程启动时,新流程具有一个新的单独环境,该环境作为父流程环境的副本开始。
  • 任何流程(包括子流程)都可以更改自己的环境。但是,他们无法更改其父母的流程环境。
  • 运行system()创建一个新环境。

因此,当您调用system()来设置环境时,它将启动具有新环境的新子流程。然后,您的批处理程序将更改此新环境。但是随后子流程退出,其环境不再存在-随之进行所有更改。

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

相关问题