0

我正在用 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 脚本中导入这些变量?

4

2 回答 2

1

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

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

CALL "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" amd64
perl perlscript.pl
于 2012-11-05T13:03:49.803 回答
1

如果您的 BAT 文件很简单(即它只包含格式为 的行VAR=VALUE),您可以通过 Perl 对其进行解析。如果还有更多事情发生(某些值是从其他值计算出来的等),只需在 BAT 脚本末尾以VAR=VALUE.

简单格式的解析很简单:

while (<$BAT>) {
    chomp;
    my ($var, $val) = split /=/, $_, 2;
    $ENV{$var} = $val;
}
于 2012-11-05T13:09:30.940 回答