Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果从Perl脚本调用,则未设置Windows环境变量_Perl_Batch File - Fatal编程技术网

如果从Perl脚本调用,则未设置Windows环境变量

如果从Perl脚本调用,则未设置Windows环境变量,perl,batch-file,Perl,Batch File,我有一个批处理脚本setEnv.bat,它将TEST\u ENV等环境变量设置为true 我从Perl脚本中调用此批处理脚本,如: my $batch_cmd = "setEnv.bat"; system( $batch_cmd ); 我从命令行运行Perl脚本。setEnv.bat设置环境变量。Perl脚本完成后,如果执行set TEST,则输出为: 未定义环境变量测试 这意味着当批处理脚本终止并且在Perl脚本中继续执行时,环境变量将丢失 如何解决这个问题?问题是系统命令将在一个shell

我有一个批处理脚本
setEnv.bat
,它将
TEST\u ENV
等环境变量设置为
true

我从Perl脚本中调用此批处理脚本,如:

my $batch_cmd = "setEnv.bat";
system( $batch_cmd );
我从命令行运行Perl脚本。
setEnv.bat
设置环境变量。Perl脚本完成后,如果执行
set TEST
,则输出为:

未定义环境变量测试

这意味着当批处理脚本终止并且在Perl脚本中继续执行时,环境变量将丢失


如何解决这个问题?

问题是系统命令将在一个shell中执行第一个命令,在另一个shell中执行第二个命令,依此类推。 这意味着每个shell都有自己的环境,不会“看到”其他shell的环境变量

如果您只是想要一个快速而肮脏的解决方案,您可以尝试将命令与&&组合,例如:

system('setEnv.bat && doSomething.bat');

这并不理想,但如果您不想在上面花费太多时间,它应该可以工作(顺便说一句,&&应该可以在Windows和Unix上工作)。

尝试在Perl脚本中使用下面的Windows Perl模块来设置Windows环境变量:

Win32::AdminMisc::SetEnvVar
示例代码:

use Win32::AdminMisc;

$name="Temp";
$val="C:/tmp";
SetEnvVar($name,$val);
这将环境变量$name设置为$val,如果不存在,则创建$name。 新值将全局设置。 有关更多信息,请参阅SetEnvVar()上的文档。 《Win32 Perl脚本:管理员手册》一书还参考了SetEnvVar()


这并不奇怪。您可以通过在调用Perl脚本之前设置环境来解决它,或者通过在Perl脚本中操作
%ENV
来解决它。我的问题是,我有一组批处理文件,我不知道它们将做什么-其中一个可能会设置环境变量,其中一个可能运行一些可执行文件,因此基本上我的perl脚本完全不知道批处理文件中有什么内容。我的perl脚本只是按顺序运行批处理文件。其他执行可执行文件的批处理文件运行良好,只有设置环境变量的批处理文件失败-未设置环境变量。现在有人可以说,我为什么不编写一个运行批处理文件序列的批处理文件呢?我发现编写批处理比编写perl程序要困难得多。谢谢。似乎“检测子流程环境变量的变化”正是我想要的。而且也没有具体的答案。但我现在明白了,除非是另一个perl程序,否则perl程序无法改变其运行的环境。但仅仅为了它没有适当缩进而投票否决是不公平的。事实上,问题的描述尽可能简单,以证明我遇到的问题。这对我的用例不起作用。我不仅有批处理脚本,还有一些其他类型的脚本,我想按顺序运行。它们是混合的,它们需要有序。但是谢谢你抽出时间。我将使用perl脚本编写脚本,主要是作为实用工具,而不是作为控制器(运行BAT、EXE等序列)。我的控制器将是一个批处理文件。我希望Perl有一些API来解决这个问题。只要您试图运行的东西可以作为shell命令运行,这就可以工作。“&&”是连续的,这意味着在第一个命令完成之前,不会执行第二个命令。关于您正在运行的其他脚本(脚本类型)的指示有助于提供帮助。不,这是Perl模块中的子例程(即在库中定义的可重用包)。在包含Perl模块(使用Win32::AdminMisc;)之后,您将从Perl程序中调用此子例程(SetEnvFar)。我已经对示例代码进行了一些更新,使其更加清晰。请让我知道我是否可以提供进一步的帮助。不幸的是,我的工具包中没有该模块。是的,你可以说我可以从www.roth.net/下载它,但我不能在一个组织中不经过很多过程就安装第三方。所以我现在至少不能走这条路。无论如何,谢谢。假设您使用的是ActiveState Perl,您可以将www.roth.net添加到您的存储库中,并使用ppm安装包,将其添加到您的ppm存储库中。使用“ppm存储库”,然后安装(“ppm安装Win32::AdminMisc”)。我相信该模块在艺术许可证或GPL下可用。无论如何,我希望我能在某种程度上帮上忙。:-)