如果初始化PATH env变量,则Perl IPC :: Cmd不运行应用程序

时间:2012-03-08 15:49:54

标签: perl

我正在编写一个我编写过的库的测试脚本,作为测试的一部分,我正在清除$ 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变量进行测试?

2 个答案:

答案 0 :(得分:2)

这里的问题是Windows在PATH env变量中也需要%windir%\ system32。添加这个,'c:\ strawberry \ perl \ bin'解决了这个问题。

答案 1 :(得分:1)

您已选择将“命令”作为字符串而不是数组参考提交。

您确定无法找到的文件是perl.exe而不是cmd.exe吗?