2009-12-17 23 views
5

Si je fais un script batch nommé temp.bat (par exemple) contenant:Pourquoi cmd.exe a un comportement errorlevel différent sur une machine 64 bits?

exit /b 1 

Quand je lance de diverses manières, j'obtenir un comportement différent sur mon système XP 32 bits contre 64 bits Système XP.

32 bits:

> temp.bat 
> echo %ERRORLEVEL% 
1 
> cmd /c temp.bat 
> echo %ERRORLEVEL% 
0 

64 bits:

> temp.bat 
> echo %ERRORLEVEL% 
1 
> cmd /c temp.bat 
> echo %ERRORLEVEL% 
1 

J'ai recherché les options cmd.exe et j'ai été incapable de trouver des options contrôlant la façon dont il propage des informations de niveau d'erreur à partir de scripts batch. À ce stade, je suis incapable de trouver une explication rationnelle à cette différence.

+0

Ma conjecture: La version 32 bits maintenant le comportement original est due à la rétrocompatibilité. La version 64 bits n'a pas cette exigence, donc le comportement est plus favorable aux scripts automatisés. –

+0

Aha! La fille de Raymond [http://blogs.msdn.com/oldnewthing/archive/2003/12/24/45779.aspx] vs demoiselle d'honneur de Raymond [http://blogs.msdn.com/oldnewthing/archive/2009/12/02 /9931184.aspx # 9931572] –

+0

Impossible de reproduire ici. Fonctionne la même sur les deux 32 et 64 bits. – Joey

Répondre

7

Vous devez être prudent avec exit/b car il ne fonctionne pas correctement dans tous les cas. Par exemple:

temp.bat&&echo 0||echo 1

Si temp.bat contient sortie/b 1 vous attendez 1 à imprimer, mais ce n'est pas. Malheureusement, la seule façon de vraiment définir un code de sortie de travail pour un fichier de commandes est d'utiliser @%COMSPEC% /C exit 1 comme dernière ligne dans le fichier batch

+0

Excellent, j'ai essayé votre suggestion et cela fonctionne de la même manière sur les deux machines. – paraquat

3

Le problème avec l'exemple de Anders est qu'il utilise un fichier .bat. Si vous utilisez un fichier .cmd, la sortie fonctionne comme indiqué. Le principal point d'avoir à la fois les fichiers .bat et .cmd semble être la compatibilité ascendante: s'il exécute un fichier .bat, cmd essaie d'émuler l'interface CLI pré-NT, command.com, qui avait une gestion des erreurs beaucoup plus simple .

Au moins c'est ce que je pense. Je suis tombé sur ce fil alors que je cherchais des documents officiels sur le fichier .bat/.cmd, que je n'arrive pas à trouver.