我正在编写一个我编写过的库的测试脚本,作为测试的一部分,我正在清除$ ENV {PATH}变量,以确保我放在路径中的东西不会取得成功。该库将所需的路径附加到PATH变量。
对于后台,我在32位Windows XP上运行Strawberry Perl v5.12.0。 IPC :: Cmd版本为0.76,IPC :: Open3版本为1.05。
我看到的错误是如果我清除PATH变量然后设置它,使用IPC :: Open3的IPC :: Cmd找不到应用程序。如果我不这样做,那么它会运行正常。这是一个说明此错误的示例脚本:
use strict;
use warnings;
use IPC::Cmd qw(run);
$ENV{PATH} = '';
$ENV{PATH} = 'c:\\strawberry\\perl\\bin';
my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf) =
run(command => 'perl -v', verbose => 0);
if ($success) {
print 'Success: ';
print join("\n", @{$stdout_buf});
} else {
print 'Failure: ';
print join("\n", @{$full_buf});
}
exit 0;
如果我像这样运行它,它会打印失败线,如果我用两个$ENV{PATH} =
注释掉它,那么它会输出成功线。我已经尝试通过改变斜线并在最后添加斜线来解决第二条PATH线,但这没有用。
我通过调试器运行它,故障发生在IPC :: Open3的第398行:
$pid = eval { system 1, @_ }; # 1 == P_NOWAIT
。如果我在此行之后检查$!
,它会告诉我'没有这样的文件或目录'。此时PATH仍然设置正确,它在任何时候都不会被改变。
另一个奇怪的地方,我在重置PATH后尝试使用IPC :: Cmd中的can_run
方法,它会找到没有问题的命令。
在为此提交错误报告之前,有没有人看过这个并知道如何修复它?另外,对于我正在尝试做的事情,这是正确的方法,还是有更好的方法来重置PATH变量进行测试?
答案 0 :(得分:2)
这里的问题是Windows在PATH env变量中也需要%windir%\ system32。添加这个,'c:\ strawberry \ perl \ bin'解决了这个问题。
答案 1 :(得分:1)
您已选择将“命令”作为字符串而不是数组参考提交。
您确定无法找到的文件是perl.exe而不是cmd.exe吗?