Perché cmd.exe hanno un comportamento errorlevel diverso su un computer a 64 bit?
-
20-09-2019 - |
Domanda
Se faccio uno script batch chiamato temp.bat (per esempio) che contiene:
exit /b 1
Quando eseguo in vari modi, ottengo un comportamento diverso sul mio sistema XP a 32 bit rispetto a un sistema a 64-bit di XP.
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 che controllano come si propaga le informazioni errorlevel da script batch. A questo punto non riesco a trovare alcuna spiegazione razionale di questa differenza.
Soluzione
Bisogna stare attenti con uscita / b dal momento che in realtà non funziona correttamente in tutti i casi. Ad 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 ultima riga nel file batch
Altri suggerimenti
Il problema con l'esempio di Anders è che usa un file .bat. Se si utilizza un file .cmd, 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 questa è la mia supposizione. Mi sono imbattuto in questa discussione, mentre googling per documentazione ufficiale sul .bat / .cmd cosa, che io non riesco a trovare.