为什么我的系统调用不能在我用pp包装的Perl程序中工作?

时间:2009-07-10 16:21:18

标签: perl activeperl par perl-packager

我在Win32 ActivePerl上运行Perl / POE / Tk脚本,使用system调用可执行文件。我使用pp创建了脚本的exe。我可以解压缩exe并查看“zip”文件目录的根目录下的可执行文件,但是当我运行exe并尝试使用系统调用的功能时,我得到一个“找不到文件”类型的错误;

'..\cpau' is not recognized as an internal or external command, 
operable program or batch file.

cpau.exe是其中一个包含的文件。

这样称为

pp

pp -i alias3.ico -g -a add_event.job -a add_rec.job -a CPAU.exe -a del_event.job -a del_rec.job -a dnscmd.exe -a eventcreate.exe -o alias_v_3-0.exe alias_poe_V-3_0_par.pl

我猜我需要调整system来电的路径。我目前正在尝试使用默认路径;

system("cpau -dec -file add_rec.job -nowarn -wait");

我试过了:

system("..\cpau -dec -file ..\add_rec.job -nowarn -wait");

推理pp将脚本放在\ scripts \目录中,但没有快乐。有什么建议?

3 个答案:

答案 0 :(得分:3)

更新:我的建议不起作用。但是,我会留下它们以防其他人有类似的问题。这个答案显示了许多听起来合理但不起作用的事情。

有关解决 OP问题的代码discussion following the OP's repost,请参阅using $ENV{PAR_TEMP}

FOR REFERENCE

pp docs说:

  

-a, - addfile = FILE | DIR   ...

     
    

默认情况下,文件以其原始名称放在包内/内。

  

通过使用系统,您要求cmd.exe找到该文件,我现在意识到这可能是一场失败的战斗,除非您有一个名为cpau.exe的单独可执行文件。我现在没有时间尝试此操作,但您可能必须自己执行forkexec而不是依赖system。如:

exec 'CPAU.exe', @args

上一个回答:

您传递给system的字符串不包含您的想法:

use strict;
use warnings;

my $x= "..\cpau -dec -file ..\add_rec.job -nowarn -wait";

print $x, "\n";
__END__

C:\Temp> fgh
..►au -dec -file ..dd_rec.job -nowarn -wait

使用(编辑以下OP的评论):

system "..\\cpau -dec -file ../add_rec.job -nowarn -wait";

我还建议使用system的列表表单:

system '..\\cpau', qw(-dec -file ../add_rec.job -nowarn -wait);

此外,如果您想指定相对于当前脚本目录的cpau路径,您可能会发现FindBin

例如:

#!/usr/bin/perl

use strict;
use warnings;

use FindBin qw($Bin);
use File::Spec::Functions qw( catfile );

my $program = catfile $Bin, '..', 'cpau';

system $program, qw(-dec -file ../add_rec.job -nowarn -wait);

__END__

答案 1 :(得分:2)

请参阅帖子"Where does pp (PAR) unpack add (-a) files?"

中的最终解决方案

答案 2 :(得分:0)

我意识到代码中另一个可执行文件的调用正在运行。我查看并发现正在使用的呼叫使用了backtic而不是system()调用。我把其他调用改为了背景,问题就消失了。

`。\\ cpau -dec -file。\\ del_rec.job -nowarn -wait`;

所以,这解决了问题,为什么要买? system()和win32 shell中的backtic之间有什么区别?

说得太快了。这适用于已存在cpau的目录。当我在c:\ temp中尝试它时,我得到“'cpau'不被识别为内部或外部命令,可操作程序或批处理文件。”错误。非常令人沮丧。

我很难过。

`cpau -dec -file del_rec.job -nowarn -wait`;

我尝试了没有leanding“。\\”。同样的错误。