2009-07-10 17 views
2

systemを使用して実行ファイルを呼び出すWin32 ActivePerl上で動作するPerl/POE/Tkスクリプトがあります。私はppを使ってスクリプトのexeを作成しました。私はexeファイルを解凍し、 "zip"ファイルディレクトリのルートから実行ファイルを見ることができますが、exeを実行してシステムコールの機能を使用しようとすると、 "ファイルが見つかりません"というエラーが発生します。私のシステムコールは、私がppでラップするPerlプログラムで動作しないのはなぜですか?

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

cpau.exeは含まれているファイルの1つです。

pp

は、このように呼ばれている:私は systemのコールのパスを調整する必要があると推測してい

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 

。私は現在、デフォルトのパスを使用しようとしています。 \スクリプト\ディレクトリにスクリプトを置くPP

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

推理、ない喜び:

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

は、私はこれを試してみました。助言がありますか?

+0

CPAU.exeは以下に示す別ファイルです。 pp -iエイリアス3.i-CPAU.exe -a .exe alias_poe_V-3_0_par.pl POE内でフォーク全体が実行されているため、フォークはちょっとした犬を得るかもしれません。コマンドが壊れていて/特別に処理されている場合は、 – jpolache

答えて

3

更新:私のの提案は動作しません。しかし、他の人が同様の質問をした場合に備えて、私はそれらを残すつもりです。この回答は合理的だと思うかもしれませんが、うまくいかないものがたくさんあります。

がREFERENCE

pp docs FOR OPの問題

を解決することをコードusing $ENV{PAR_TEMP}ためdiscussion following the OP's repostを参照してくださいは言う:

-a、--addfile = FILE | DIR 。 ..

デフォルトでは、ファイルは元の名前でパッケージの下/内部に配置されます。システムを使用することにより

は、あなたがファイルを見つけるためにcmd.exeを求めていると私は今あなたがcpau.exeと呼ばれる別の実行可能ファイルを持っていない限り、おそらく負け戦であることを認識しています。今はこれを試す時間がありませんが、systemに頼るのではなく、forkexecを自分で行う必要があります。

exec 'CPAU.exe', @args 

前の答え:のように

以下OPさんのコメント以下に編集
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 

使用(を:

あなたはsystemに渡す文字列は、あなたはそれがないと思う何が含まれていません):

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

私もsystemのリスト形式を使用することをお勧めします:あなたは、現在のスクリプトのディレクトリからの相対cpauへのパスを指定する場合は

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

また、あなたはFindBinが便利かもしれません。例えば

+1

または '.. .. \ .. ..' 'または' .. .. \ .. ''(Win32 APIに渡すのではなく、/とパス区切り文字として\)。 – ephemient

+0

試したシステム '../cpau'、qw(-dec -file ../add_rec.job -nowarn -wait); 戻ってきました。 '..'は内部または外部のコマンドとして認識されません。 操作可能なプログラムまたはバッチファイル。 – jpolache

+0

システム '。\\ cpau'、qw(-dec -file。\\ add_rec.job -nowarn -wait); は、exeファイル内の他のファイルは既に存在しますが、exeファイルが単独のディレクトリにある場合は動作しません。 – jpolache

0
#!/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__ 

Iコードで実行する別のコールが働いていたことに気づきました。私は見て、働いていた呼び出しがsystem()呼び出しではなく、backticsを使用していることを発見しました。他のコールをバッククエストに変更し、問題は解決しました。

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

だから、これで問題が解決され、なぜ買うのですか? win32シェルのsystem()とbackticの違いは何ですか?

話が早すぎます。これは、cpauがすでに存在するディレクトリで動作します。私はc:\ tempで試してみましたが、 "'cpau'は内部または外部コマンド、実行可能プログラムまたはバッチファイルとして認識されません。エラー。非常にイライラ。

私は困惑しています。

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

私はそれを試してみました。いずれの場合も同じエラー。

関連する問題