2012-03-08 88 views
2

我正在爲我編寫的庫編寫測試腳本,並且作爲測試的一部分,我正在清除$ ENV {PATH}變量以確保我放在我的路徑中的東西不會導致成功。該庫將所需的路徑附加到PATH變量。如果PATH env變量初始化,Perl IPC :: Cmd不運行應用程序

爲了背景,我在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

在清除/重置之前,$ ENV {PATH}設置爲什麼? – vmpstr 2012-03-08 16:06:04

+0

@vmpstr謝謝你,我慢慢地記住了這一點。由於這是Windows,%windir%\ system32也必須位於路徑中。我補充說,它的工作原理。 – Joel 2012-03-08 16:13:25

回答

2

這裏的問題是Windows在PATH env變量中也需要%windir%\ system32。添加這個,'c:\ strawberry \ perl \ bin'解決了這個問題。

1

您已選擇將「command」作爲字符串提交,而不是數組ref。

您確定無法找到的文件是perl.exe而不是cmd.exe嗎?