2010-11-19 18 views
1

Je dois terminer le script perl en fonction du code de retour de l'étape précédente.
quelque chose commeerrorlevel in perl

IF ERRORLEVEL 1 goto ERROR 

dans le traitement par lots.
i ont

$PROG = `spu_comp 2>&1 $a 1 1`; 

i besoin si cette étape donne l'erreur, le programme devrait se terminer.
merci d'avance pour vos entrées.

+0

Définir "cette étape donne une erreur"? Qu'est-ce qui constitue une erreur? Lorsque vous déterminerez cela, vous saurez comment le détecter. – Ether

Répondre

4

Immédiatement après la ligne où vous attribuez à $PROG, ajoutez cette ligne:

($? >> 8) and die "spu_comp exited with non-zero return value"; 
+3

très tentant d'afficher une réponse qui est juste '$?' :) – ysth

+0

ne fonctionne pas. le code n'a aucun effet. – ajay477

+0

Ensuite, 'spu_comp' est en train de quitter avec une valeur de retour de 0. – cdhowie

1
$ perl -le'`sh -c "exit 0"`;($?>>8) and die "exited with non-zero: ", ($?>>8)' 
$ perl -le'`sh -c "exit 1"`;($?>>8) and die "exited with non-zero: ", ($?>>8)' 
exited with non-zero: 1 at -e line 1. 
0

Il semble que ERRORLEVEL est pas un vrai code de sortie à Perl.

J'ai le même problème. Un fichier de chauve-souris de

@Echo OFF 
echo setting error level 1 
EXIT /B 1 

Avec un fichier perl de

#!/usr/bin/perl 
$command = `C:\foo.bat`; 
print "Error Level: " .$? ."\n"; 
print "Command: " . $command . "\n"; 

rendements sortie

Error Level: 0 
Command: 

Un fichier perl de

#!/usr/bin/perl 

my $command = `dir`;#try both dir and dri to test real exit codes against batch exit codes 
print "Error Level: " .$? ."\n"; 
print "Command: " . $command . "\n"; 

donnera

C:\>back.pl 
'dri' is not recognized as an internal or external command, 
operable program or batch file. 
Error Level: 256 
Command: 

C:\>back.pl 
Error Level: 0 
Command: Volume in drive C has no label. 
Volume Serial Number is 8068-BE74 

Directory of C:\ 

12/13/2010 11:02 AM     7 8 
06/02/2010 01:13 PM     0 AUTOEXEC.BAT 
06/04/2010 01:00 PM <DIR>   AutoSGN 
12/13/2010 12:03 PM    111 back.pl 
06/02/2010 01:13 PM     0 CONFIG.SYS 
06/03/2010 07:37 PM <DIR>   Documents and Settings 
12/13/2010 12:01 PM    46 foo.bat 
06/04/2010 03:17 PM <DIR>   HorizonTemp 
06/02/2010 02:41 PM <DIR>   Intel 
06/04/2010 02:19 PM <DIR>   league 
06/04/2010 12:31 PM <DIR>   Perl 
12/10/2010 03:28 PM <DIR>   Program Files 
12/08/2010 04:13 PM <DIR>   Quarantine 
12/13/2010 08:14 AM <DIR>   WINDOWS 
       5 File(s)   164 bytes 
       9 Dir(s) 18,949,783,552 bytes free 


C:\> 
+0

Cela fonctionne maintenant, mais cela fonctionne avec le code d'erreur EXIT/B sur une machine et sans/B sur l'autre. et pas vice versa. – Tristan

0

Vous pouvez obtenir le code retour correct à partir de $ PROG en ajoutant la ligne suivante.

my $ret = $?/256 #/ 

ou un nettoyant façon

my $ret = $? >> 8; 

Ensuite, comparez le $ ret avec les valeurs possibles que vous pouvez récupérer

if ($ret == 0) 
{ 
    # Do something if finished successfully 
} 
elsif($ret == 1) 
{ 
    error(); 
} 
else 
{ 
    # Return something else that was nor 0 nor 1 
} 
0

Suite à la réponse de @ décortiqueuse, il est intéressant de noter $? ne fonctionne que pour codes de 255 ou moins. Windows error codes dépasse généralement cela. Le module IPC::System::Simple, cependant, fournit des méthodes comme capture() qui peuvent récupérer correctement les codes> 255.

par exemple.

use Test::More; 
use IPC::System::Simple qw(capture $EXITVAL EXIT_ANY); 
my $modeTest = capture(EXIT_ANY, "some command that sets error code 5020"); 
is($EXITVAL , 5020, "Expect error code 5020");