【问题标题】:Importing environment variables set by batch file in parent Perl script在父 Perl 脚本中导入由批处理文件设置的环境变量
【发布时间】:2012-11-05 12:31:08
【问题描述】:

我正在用 Perl 编写一个用于代码编译的跨平台构建脚本。

在Windows下,我需要执行vsvars32.bat来设置环境变量:

sub set_win_env {
      #MSVC version 9.0 is installed
      $VS90COMNTOOLS = $ENV{'VS90COMNTOOLS'};
      $VS90COMNTOOLS .= "vsvars32.bat"
      if($VS90COMNTOOLS ne "") {
          system("$VS90COMNTOOLS");
      }
 }

通过执行批处理文件设置的环境变量会丢失,因为解释器会生成另一个 shell 来执行批处理文件。

如何在父 Perl 脚本中导入这些变量?

【问题讨论】:

  • 顺便说一句,变量与常量字符串连接后如何成为空字符串?条件始终为真。
  • 是的,没用的检查...最初我是在检查后附加变量... :)

标签: perl environment-variables


【解决方案1】:

如果你的 BAT 文件很简单(即它只包含VAR=VALUE 形式的行),你可以用 Perl 解析它。如果有更多事情发生(一些值是从其他值计算出来的等等),只需在 BAT 脚本末尾以VAR=VALUE 的形式输出所有变量名称及其值。

简单格式的解析很容易:

while (<$BAT>) {
    chomp;
    my ($var, $val) = split /=/, $_, 2;
    $ENV{$var} = $val;
}

【讨论】:

  • 我尝试以 key=value 的形式读取批处理文件。但是,批处理文件(它是一个 msvc 文件)似乎具有 %VAL%=:%VAL% 形式的值。在这种情况下,我无法阅读正确和完整的值。而且我无法修改批处理文件。只能读那个,
【解决方案2】:

如您所说,使用system 将在子进程中设置环境变量,而不是在当前进程中。问题是你有一个 '.bat' 格式的文件,它是与 Perl 不同的语言(好吧,也许称它为一种语言有点强)。

您需要自己解析文件并将其翻译成 Perl,或者从具有(例如)以下内容的 .bat 文件运行您的 perl:

CALL "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" amd64
perl perlscript.pl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多