2009-07-10 29 views
2

J'ai un script Perl/POE/Tk s'exécutant sur Win32 ActivePerl qui appelle les exécutables en utilisant system. J'ai créé un exe du script en utilisant pp. Je peux décompresser l'exe et voir les exécutables à la racine du répertoire du fichier "zip", mais quand j'exécute l'exe et que j'essaie d'utiliser la fonctionnalité des appels système, j'obtiens un type d'erreur "fichier non trouvé";Pourquoi mes appels système ne fonctionnent-ils pas dans le programme Perl que j'emballe avec pp?

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

cpau.exe est l'un des fichiers inclus.

pp est appelé ainsi:

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 

Je suppose que je dois régler le chemin des system appels. J'essaie actuellement d'utiliser le chemin par défaut;

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

J'ai essayé ceci:

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

raisonnement que pp mettre le script dans les scripts \ \ répertoire, mais pas de joie. Aucune suggestion?

+0

CPAU.exe est un fichier séparé comme indiqué ci-dessous; pp -i alias3.ico -g -a CPAU.exe -a ajouter_événement.job -a ajouter_rec.job -a del_événement.job -a del_rec.job -a dnscmd.exe -a événementcreate.exe -o alias_v_3-0 .exe alias_poe_V-3_0_par.pl La fourche pourrait être un peu plus grosse alors que le tout tourne au POE. – jpolache

Répondre

3

Mise à jour: Mes suggestions ci-dessous ne fonctionnent pas. Cependant, je vais les laisser au cas où quelqu'un d'autre aurait une question similaire. Cette réponse montre beaucoup de choses qui peuvent sembler raisonnables mais ne fonctionnent pas.

Voir le discussion following the OP's repost pour le code using $ENV{PAR_TEMP} qui permet de résoudre le problème de l'OP

POUR RÉFÉRENCE

pp docs disent:

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

Par défaut, les fichiers sont placés sous/à l'intérieur du package avec leurs noms d'origine.

En utilisant le système, vous demandez cmd.exe pour trouver le fichier et je me rends compte maintenant que est probablement une bataille perdue d'avance, sauf si vous avez un exécutable séparé appelé cpau.exe. Je n'ai pas le temps d'essayer cela maintenant, mais vous devrez peut-être faire les fork et exec vous-même au lieu de compter sur system.Comme dans:

exec 'CPAU.exe', @args 

Réponse précédente:

La chaîne que vous passez à system ne contient pas ce que vous pensez qu'il fait:

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 

Utilisation (modifié suivant le commentaire OP ci-dessous):

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

Je recommande également d'utiliser le formulaire de liste des system:

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

De plus, vous pourriez trouver FindBin pratique si vous souhaitez spécifier le chemin vers cpau par rapport au répertoire du script en cours.

Par exemple:

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

Ou '" .. \\ .. "' ou ''.. \ ..'' si la commande est cassée et gère/spécialement (par opposition à simplement les transmettre à l'API Win32, qui comprend globalement les deux/et \ comme délimiteurs de chemin). – ephemient

+0

Système essayé '../cpau', qw (-dec -fichier ../add_rec.job -nowarn -wait); Revenez; '..'n'est pas reconnu comme commande interne ou externe, programme exécutable ou fichier séquentiel. – jpolache

+0

système '. \\ cpau', qw (-dec-fichier. \\ add_rec.job -nowarn -wait); fonctionne si le répertoire où se trouve l'exe contient déjà les autres fichiers, mais pas si l'exe se trouve dans un répertoire à part. – jpolache

0

Je réalise qu'un autre appel à un exécutable dans le code fonctionnait. J'ai regardé et trouvé que l'appel qui fonctionnait utilisait des backtics plutôt qu'un appel system(). J'ai changé les autres appels à backtics et le problème est parti.

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

Donc, cela résout le problème, pourquoi acheter? Quelle est la différence entre system() et un backtic dans le shell win32?

Rated trop tôt. Cela fonctionne dans un répertoire où cpau existe déjà. Quand je l'ai essayé dans c: \ temp, le "cpau" n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier séquentiel. " Erreur. Très frustrant.

Je suis perplexe.

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

Je l'ai essayé avec et sans le ". \\". Même erreur de toute façon.