【问题标题】:Set environment variables by batch file called from perl script通过从 perl 脚本调用的批处理文件设置环境变量
【发布时间】:2018-09-06 18:32:35
【问题描述】:

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

【问题讨论】:

  • 第一个命令(路径中有空格)实际上运行正确吗?例如,请参阅my answer to Execute Windows command with spaces in Perl
  • 是的,第一个命令似乎运行良好。我可以看到该批处理文件向控制台打印了一些横幅。
  • 您创建一个shell,执行一个批处理文件,该文件执行诸如更改该进程的环境之类的操作,然后退出您更改的进程。您需要以某种方式在同一个 shell 中执行这两个命令。
  • 我将如何在 perl 脚本中做到这一点?

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


【解决方案1】:
  • 您的进程有一个关联的环境,其中包含搜索路径等内容。
  • 当子流程启动时,新流程将拥有一个新的、独立的环境,该环境作为父流程环境的副本启动。
  • 任何进程(包括子进程)都可以改变自己的环境。但是,它们无法更改其父进程的环境。
  • 运行 system() 会创建一个新环境。

所以当你调用system() 来设置你的环境时,它会启动一个带有新环境的新子流程。然后,您的批处理程序会更改这个新环境。但随后子流程退出,其环境不复存在 - 随之而来的是所有更改。

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

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多