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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过从perl脚本调用的批处理文件设置环境变量相关的知识,希望对你有一定的参考价值。

让我们考虑以下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脚本一两年没有任何问题。突然间它停止了工作。

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

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

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

以上是关于通过从perl脚本调用的批处理文件设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

将环境变量设置为从 perl 脚本执行的 shell

使用 subprocess.Popen Python 执行两个命令 [重复]

无法通过从两个不同子例程传递给新子例程的值来执行计算:Perl

使用python调用设置环境变量的批处理脚本并运行另一个使用它们的程序

如何通过从 input type='file' 中选择来设置多个视频文件的预览

如何在vbs中设置可以在调用批处理脚本中读取的环境变量