2

Win32ActivePerlで実行されているPerl/POE / Tkスクリプトがあり、を使用して実行可能ファイルを呼び出しますsystem。を使用してスクリプトのexeを作成しましたpp。exeを解凍して、「zip」ファイルディレクトリのルートから実行可能ファイルを確認できますが、exeを実行してシステムコールの機能を使用しようとすると、「ファイルが見つかりません」タイプのエラーが発生します。

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

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

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\ディレクトリに置いたと推論しましたが、喜びはありませんでした。助言がありますか?

4

2 に答える 2

3

更新:以下の私の提案は機能しません。ただし、他の誰かが同様の質問をする場合に備えて、それらを残しておきます。この回答は、合理的に聞こえるかもしれませんが、機能しない多くのことを示しています。

OPの問題を解決する$ENV{PAR_TEMP}を使用したコードについては、OPの再投稿に続く説明を参照してください。

参考のために

ppドキュメントは言う:

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

デフォルトでは、ファイルは元の名前でパッケージの下/内部に配置されます。

システムを使用することで、ファイルを検索するように求めcmd.exeられますが、と呼ばれる別の実行可能ファイルがない限り、おそらく負け戦であることがわかりますcpau.exe。今はこれを試す時間がありませんが、に頼るのではなくfork、自分でやらなければならないかもしれません。のように:execsystem

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);

さらに、現在のスクリプトのディレクトリからの相対パスを指定する場合は、 FindBinが便利な場合があります。cpau

例えば:

#!/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__
于 2009-07-10T17:05:48.713 に答える
0

コード内の実行可能ファイルへの別の呼び出しが機能していることに気付きました。調べてみると、機能していたコールがsystem()コールではなくbackticsを使用していることがわかりました。他の呼び出しをbackticsに変更すると、問題は解決しました。

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

だから、これは問題を解決します、なぜ購入しますか?system()とwin32シェルのbackticの違いは何ですか?

話が早すぎた。これは、cpauがすでに存在するディレクトリで機能します。c:\ tempで試してみると、「'cpau'は内部または外部コマンド、操作可能なプログラム、またはバッチファイルとして認識されません」というメッセージが表示されました。エラー。とてもイライラします。

私は困惑しています。

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

傾いた「。\\」の有無にかかわらず試してみました。どちらの方法でも同じエラー。

于 2009-07-13T13:51:03.397 に答える