通过从 perl 脚本调用的批处理文件设置环境变量
Set environment variables by batch file called from perl script
让我们考虑以下 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' is not recognized as an internal or external command,
operable program or batch file.
看来批处理文件中设置的环境变量对 perl 脚本的上下文不可用。我该怎么做才能完成这项工作?
注一
运行 首先来自控制台的批处理文件 window 然后 运行ning msbuild
工作正常。因此批处理文件按预期工作并且 msbuild 实际上可用。
注2
我的真实 perl 脚本要长得多。这里的这个例子是一个巨大的简化,可以重现问题。所以我不能轻易地用批处理文件替换 perl 脚本,例如。
注3
有趣的是:我已经使用这个 perl 脚本一两年了,没有任何问题。然后突然就停止工作了。
- 您的进程有一个关联的环境,其中包含诸如搜索路径之类的内容。
- 当子进程启动时,新进程有一个新的、独立的环境,该环境作为父进程环境的副本启动。
- 任何进程(包括子进程)都可以改变自己的环境。但是,它们不能更改父进程的环境。
- 运行
system()
创建新环境。
因此,当您调用 system()
来设置您的环境时,它会启动一个带有新环境的新子进程。然后您的批处理程序会更改这个新环境。但是随后子进程退出并且它的环境不复存在 - 带走了所有的变化。
在 运行 运行 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' is not recognized as an internal or external command, operable program or batch file.
看来批处理文件中设置的环境变量对 perl 脚本的上下文不可用。我该怎么做才能完成这项工作?
注一
运行 首先来自控制台的批处理文件 window 然后 运行ning msbuild
工作正常。因此批处理文件按预期工作并且 msbuild 实际上可用。
注2
我的真实 perl 脚本要长得多。这里的这个例子是一个巨大的简化,可以重现问题。所以我不能轻易地用批处理文件替换 perl 脚本,例如。
注3
有趣的是:我已经使用这个 perl 脚本一两年了,没有任何问题。然后突然就停止工作了。
- 您的进程有一个关联的环境,其中包含诸如搜索路径之类的内容。
- 当子进程启动时,新进程有一个新的、独立的环境,该环境作为父进程环境的副本启动。
- 任何进程(包括子进程)都可以改变自己的环境。但是,它们不能更改父进程的环境。
- 运行
system()
创建新环境。
因此,当您调用 system()
来设置您的环境时,它会启动一个带有新环境的新子进程。然后您的批处理程序会更改这个新环境。但是随后子进程退出并且它的环境不复存在 - 带走了所有的变化。
在 运行 运行 Perl 程序之前,您需要 运行 父进程中的批处理文件。