Quelle est la façon la plus simple de réinitialiser ERRORLEVEL à zéro?
j'ai un événement post-construction qui exécute certaines commandes pour un projet c#. La dernière commande provoque parfois la valeur ERRORLEVEL qui n'est pas égale à zéro et puis la compilation échoue.
je veux ajouter une ligne de commande supplémentaire pour toujours mettre la valeur ERRORLEVEL à zéro. Quelle est la façon la plus commode de le faire?
10 réponses
si vous utilisez exit /b 0
vous pouvez retourner un errorlevel 0
à partir d'un script de lot enfant sans quitter le parent.
Semble faire l'affaire:
ver > nul
tout ne fonctionne pas, et on ne sait pas pourquoi. Par exemple, ce qui suit ne s'applique pas:
echo. > nul
cls > nul
dans un événement pré-ou post-construction, 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-construction, un moyen rapide de le désactiver et d'éviter de déclencher un contrôle pour un non-zéro errorlevel
est de suivre la ligne d'échec avec une ligne qui retourne explicitement zéro:
cmd /c "exit /b 0"
il s'agit essentiellement d'une combinaison générique des solutions mentionnées précédemment qui fonctionnera avec plus de juste la dernière ligne de pré - ou de post-construction de l'événement.
j'ai trouvé que" exit 0 " ressemble à un bon moyen de traiter ce problème.
Exemple D'Usage:
NET STOP Underdevice /Y
exit 0
si le service sous-desservi n'est pas démarré.
j'utilise personnellement ceci:
cd .
fonctionne même avec Unix shell.
Mais, celui-ci pourrait être un peu plus rapide:
type nul>nul
parce que Process Monitor
montre QueryDirectory
appelle cd .
PS:
cd .
a un autre effet secondaire dans la coque unix. Il ne restaure répertoire de travail recréé dans le terminal s'il a été ouvert avant de l'effacer.
S'il s'agit d'un extrait comme" Post-build Event " etc.
(...) || 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 sait que Windows shell saura ce qui se passe, et quelle était votre intention.
cependant, si vous êtes dans un script batch, vous pouvez utiliser des sous-machines, qui sont un léger équivalent du script "child batch" de la réponse d'akf.
ont un sous-programme:
:reset_error
exit /b 0
et puis juste
call :reset_error
où que vous en ayez 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
qui produit:
After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
comme vous le voyez - simplement appeler et revenir via goto:eof n'est pas suffisant.
ajouter >nul
après chaque commande qui est susceptible de tomber en panne - cela semble empêcher la construction de tomber en panne.
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)
je l'ai toujours utilisé;
set ERRORLEVEL=0
Je l'utilise depuis des années.