2009-12-17 10 views
5

Se faccio un temp.bat script batch di nome (per esempio) che contiene:Perché cmd.exe ha un comportamento di errorlevel diverso su un computer a 64 bit?

exit /b 1 

Quando eseguo in vari modi, ottengo un comportamento diverso sul mio sistema a 32-bit di XP rispetto a un 64-bit Sistema XP.

su 32-bit:

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

a 64 bit:

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

Ho cercato attraverso le opzioni di cmd.exe e sono stato in grado di trovare tutte le opzioni di controllo come diffonde informazioni sugli errori da script batch. A questo punto non sono in grado di trovare alcuna spiegazione razionale per questa differenza.

+0

La mia ipotesi: la versione a 32 bit che mantiene il comportamento originale è dovuta alla retrocompatibilità. La versione a 64 bit non ha quel requisito, quindi ha un comportamento più amichevole per gli script automatizzati. –

+0

Aha! La figlia di Raymond [http://blogs.msdn.com/oldnewthing/archive/2003/12/24/45779.aspx] contro la damigella d'onore di Raymond [http://blogs.msdn.com/oldnewthing/archive/2009/12/02 /9931184.aspx#9931572] –

+0

Impossibile riprodurre qui. Funziona allo stesso modo su entrambi i 32 e 64 bit. – Joey

risposta

7

È necessario fare attenzione con exit/b poiché in realtà non funziona correttamente in tutti i casi. Per esempio:

temp.bat&&echo 0||echo 1

Se temp.bat contiene uscita/b 1 ci si aspetterebbe 1 da stampare, ma non lo è. Purtroppo, l'unico modo per impostare davvero un codice di uscita che lavora per un file batch è quello di utilizzare @%COMSPEC% /C exit 1 come l'ultima riga nel file batch

+0

Eccellente, ho provato il tuo suggerimento e funziona allo stesso modo su entrambe le macchine. – paraquat

3

Il problema con l'esempio di Anders è che usa un file .bat. Se si utilizza un file .cmd, l'uscita funziona come documentato.

Il punto principale di avere sia i file .cmd .bat e sembra che ci sia la compatibilità all'indietro: se è l'esecuzione di un file .bat, cmd cerca di emulare il pre-NT CLI, command.com, che ha avuto molto più semplice la gestione degli errori .

Almeno questo è il mio punto di vista. Mi sono imbattuto in questo thread mentre cercavo su google per i documenti ufficiali sulla cosa .bat/.cmd, che non riesco a trovare.