2009-07-10 25 views
2

Ich habe ein Perl/POE/Tk-Skript auf Win32 ActivePerl ausgeführt, das ausführbare Dateien mit system aufruft. Ich habe eine Exe des Skripts mit pp erstellt. Ich kann die exe entpacken und die ausführbaren Dateien von der Wurzel des "zip" -Dateiverzeichnisses sehen, aber wenn ich die exe ausführe und versuche, die Funktionalität der Systemaufrufe zu benutzen, bekomme ich einen "Datei nicht gefunden" -Typ des Fehlers;Warum funktionieren meine Systemaufrufe im Perl-Programm nicht?

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

cpau.exe ist eine der enthaltenen Dateien.

pp wird so genannt:

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 

Ich vermute, dass ich den Weg der system Anrufe anpassen müssen. Ich versuche derzeit, den Standardpfad zu verwenden.

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

Ich habe versucht, dieses:

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

Argumentation, die das Skript in den \ scripts setzen pp \ Verzeichnis, aber keine Freude. Irgendwelche Vorschläge?

+0

CPAU.exe eine separate Datei ist wie unten angegeben; pp -i alias3.ico -g -a CPAU.exe -a add_event.job -a add_rec.job -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 Gabel könnte ein bisschen Hund bekommen, wie die ganze Sache innerhalb POE läuft. – jpolache

Antwort

3

Aktualisierung: Meine Vorschläge unten funktionieren nicht. Ich werde sie jedoch zurücklassen, falls jemand anders eine ähnliche Frage hat. Diese Antwort zeigt viele Dinge, die vernünftig klingen können, aber nicht funktionieren.

Siehe discussion following the OP's repost für Code using $ENV{PAR_TEMP} dass löst das Problem des OP

REFERENZ

pp docs sagen:

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

Standardmäßig werden Dateien unter/in dem Paket mit ihren ursprünglichen Namen platziert.

Nach System verwenden, können Sie fragen cmd.exe um die Datei zu finden, und ich weiß jetzt, dass wahrscheinlich eine verlorene Schlacht ist, es sei denn Sie eine separate ausführbare cpau.exe genannt haben. Ich habe keine Zeit, dies jetzt zu versuchen, aber Sie müssen möglicherweise die fork und exec selbst statt auf system zu tun.Wie in:

exec 'CPAU.exe', @args 

Zurück Antwort:

Die Zeichenfolge Sie system nicht passieren enthalten, was Sie denken, es tut:

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 

Use (bearbeitet folgende OP Kommentar unterhalb):

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

Ich würde auch empfehlen die Liste Form von system mit:

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

Darüber hinaus könnten Sie FindBin handlich finden, wenn Sie den Pfad zu cpau relativ zum aktuellen Skript Verzeichnis angeben möchten.

Zum Beispiel:

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

Oder '" .. \\ .. "' oder ''.. \ ..'' wenn der Befehl gebrochen ist und// behandelt (im Gegensatz zur Übergabe an die Win32-API, die sowohl/als auch global versteht \ als Pfadbegrenzer). – ephemient

+0

Versuchtes System '../cpau', qw (-dec -datei ../add_rec.job -nowarn -wait); Ich bin zurück; '..'wird nicht als interner oder externer Befehl erkannt, ausführbare Programm- oder Stapeldatei. – jpolache

+0

System '. \\ cpau', qw (-dec-Datei. \\ add_rec.job -nowarn -wait); funktioniert, wenn das Verzeichnis, in dem sich die EXE befindet, die anderen Dateien bereits enthält, aber nicht, wenn sich die EXE in einem Verzeichnis befindet. – jpolache

0

Ich erkennen, dass ein weiterer Anruf zu einem ausführbaren im Code arbeitet. Ich schaute und fand heraus, dass der Anruf, der funktionierte, nicht mit einem System() -Aufruf, sondern mit Backtics arbeitete. Ich änderte die anderen Anrufe in Backtics und das Problem ging weg.

`. \ \ cpau -Dec-Datei. \ \ del_rec.job -nowarn -wait `;

Also, das behebt das Problem, warum kaufen? Was ist der Unterschied zwischen system() und einem Backtic in der Shell win32?

Speichen zu früh. Dies funktioniert in einem Verzeichnis, in dem cpau bereits existiert. Wenn ich es in c: \ temp ausprobiert habe, habe ich festgestellt, dass '' cpau 'nicht als interner oder externer Befehl, ausführbares Programm oder Batchdatei erkannt wird. " Error. Sehr frustrierend.

Ich bin ratlos.

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

Ich versuchte es mit und ohne die Leanding ". \\". Derselbe Fehler wie auch immer.