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?
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é.
si tu utilises exit /b 0
vous pouvez renvoyer un errorlevel 0
à partir d'un script batch enfant sans quitter également le parent.
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
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.
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.
J'utilise VERIFY
ou VERIFY > nul
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.
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 ""
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)