web-dev-qa-db-fra.com

Quelle est la façon la plus simple de réinitialiser ERRORLEVEL à zéro?

J'ai un événement post-build qui exécute certaines commandes pour un projet c #. La dernière commande entraînerait parfois la valeur ERRORLEVEL différente de zéro, puis la génération échoue.

Je veux ajouter une ligne de commande supplémentaire pour toujours définir la valeur ERRORLEVEL à zéro. Quelle est la façon la plus pratique de procéder?

64
user95319

J'ai trouvé que la "sortie 0" semblait être un bon moyen de résoudre ce problème.

Exemple d'utilisation:

NET STOP UnderDevService/Y

sortie 0

si le service UnderDevService n'est pas démarré.

17
user95319

si tu utilises exit /b 0 vous pouvez renvoyer un errorlevel 0 à partir d'un script batch enfant sans quitter également le parent.

63
akf

Semble faire l'affaire:

ver > nul

Tout ne fonctionne pas et on ne sait pas pourquoi. Par exemple, les éléments suivants ne le font pas:

echo. > nul
cls > nul
48
Jason Kresowaty

Dans un événement pré ou post-génération, si le code de retour d'un exécutable est supérieur à zéro et que l'appel à l'exécutable n'est pas la dernière ligne de l'événement pré-ou post-génération, mettez-le rapidement en sourdine et évitez déclencher une vérification pour un errorlevel non nul revient à suivre la ligne défaillante avec une ligne qui renvoie explicitement zéro:

cmd /c "exit /b 0"

Il s'agit essentiellement d'une combinaison générique des solutions susmentionnées qui fonctionneront avec plus de juste la dernière ligne d'un événement avant ou après construction.

29
Jeffrey

J'utilise personnellement ceci:

cd .

Fonctionne même sous Unix Shell.

Mais celui-ci pourrait être un peu plus rapide:

type nul>nul

Car Process Monitor affiche QueryDirectory appelle sur cd .

PS:cd . a un autre effet secondaire agréable dans le shell unix. Il restaure le répertoire de travail recréé dans le terminal s'il a été ouvert avant l'effacement.

8
Andry

J'utilise VERIFY ou VERIFY > nul

7
ixe013

S'il s'agit d'un extrait comme "Événement post-génération", etc., vous n'aurez aucun problème à ajouter:

(...) || ver > nul

à la fin de la dernière commande.

Alternativement

cmd /c "exit /b 0"

est très propre et non idiomatique - un lecteur qui connaît Windows Shell saura ce qui se passe et quelle était votre intention.

Cependant, si vous êtes dans un script batch, vous voudrez peut-être utiliser des sous-routines, qui sont un équivalent léger du "script batch enfant" de la réponse de akf.

Avoir un sous-programme:

:reset_error
exit /b 0

puis juste

call :reset_error

partout où vous en avez besoin.

Voici un exemple complet:

@echo off
rem *** main ***

call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%

call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%

call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%

:: this is needed at the end of the main body of the script
goto:eof

rem *** subroutines ***

:empty
goto:eof

:raise_error
exit /b 1

:reset_error
exit /b 0

Quelles sorties:

After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0

Comme vous le voyez, il suffit d'appeler et de revenir via goto: eof ne suffit pas.

3
Tomasz Gandor

Voici quelques autres façons de réinitialiser l'état ErrorLevel, qui fonctionnent même sous MS-DOS (au moins pour la version 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Les méthodes suivantes fonctionnent uniquement dans MS-DOS:

command /? > nul

fc nul nul > nul

Par souci d'exhaustivité, cela définit l'état ErrorLevel sur 1, valide pour Windows et MS-DOS:

< nul find ""
0
aschipfl

Ajouter >nul après chaque commande susceptible d'échouer - cela semble empêcher la génération d'échouer.

Vous pouvez toujours vérifier le résultat de la commande en examinant %errorlevel%.

Par exemple:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
0
Chiefy