让我们考虑以下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程序之前,需要在父进程中运行批处理文件。