J'exécute un programme et je veux voir quel est son code de retour (car il renvoie différents codes en fonction d'erreurs différentes).
Je sais que dans Bash, je peux le faire en exécutant
écho $?
Que dois-je faire lors de l'utilisation de cmd.exe sous Windows?
app.exe & echo %errorlevel%
Réponses:
Une pseudo variable d'environnement nommée
errorlevel
stocke le code de sortie:De plus, la
if
commande a une syntaxe spéciale:Voir
if /?
pour plus de détails.Exemple
Avertissement: Si vous définissez un nom de variable d'environnement
errorlevel
,%errorlevel%
retournera cette valeur et non le code de sortie. Utilisez (set errorlevel=
) pour effacer la variable d'environnement, permettant d'accéder à la vraie valeur deerrorlevel
via la%errorlevel%
variable d'environnement.la source
echo Exit Code is $LastExitCode
%ERRORLEVEL%
est 0 même si une erreur s'est produite. Arrivé lors de l'archivage%ERRORLEVEL%
d'un fichier cmd. Essayerstart /wait
n'a pas fonctionné. La seule chose qui a fonctionné estif errorlevel 1 (...)
string
not anint
, ce qui signifie que vous ne pouvez pas utiliserEQ
/NEQ
efficacement.Les tests
ErrorLevel
fonctionnent pour les applications de console , mais comme l' indique dmihailescu , cela ne fonctionnera pas si vous essayez d'exécuter une application fenêtrée (par exemple basée sur Win32) à partir d'une invite de commande. Une application fenêtrée s'exécutera en arrière-plan et le contrôle reviendra immédiatement à l'invite de commande (très probablement avec unErrorLevel
zéro pour indiquer que le processus a été créé avec succès). Lorsqu'une application fenêtrée se ferme, son état de sortie est perdu.Au lieu d'utiliser le lanceur C ++ sur console mentionné ailleurs, cependant, une alternative plus simple consiste à démarrer une application fenêtrée à l'aide de la commande de l'invite de
START /WAIT
commande. Cela démarrera l'application fenêtrée, attendra sa fermeture, puis renverra le contrôle à l'invite de commandes avec l'état de sortie du processus défini dansErrorLevel
.la source
if
oufor
. Pensez à utiliser à la!errorlevel!
place, comme décrit dans cette réponse .Utilisez la variable ERRORLEVEL intégrée:
Mais attention si une application a défini une variable d'environnement nommée ERRORLEVEL !
la source
$LastExitCode
dans PowerShell.Si vous souhaitez faire correspondre exactement le code d'erreur (par exemple, égal à 0), utilisez ceci:
if errorlevel 0
correspond àerrorlevel
> = 0. Voirif /?
.la source
Cela peut ne pas fonctionner correctement lorsque vous utilisez un programme qui n'est pas attaché à la console, car cette application peut toujours être en cours d'exécution alors que vous pensez avoir le code de sortie. Une solution pour le faire en C ++ ressemble à ci-dessous:
la source
Il convient de noter que les fichiers .BAT et .CMD fonctionnent différemment.
En lisant https://ss64.com/nt/errorlevel.html, il note les éléments suivants:
Cela ne me causait pas de chagrin pendant que j'exécutais des commandes successives, mais le NIVEAU D'ERREUR resterait inchangé même en cas de panne.
la source
À un moment donné, j'avais besoin de pousser avec précision les événements du journal de Cygwin vers le journal des événements Windows. Je voulais que les messages dans WEVL soient personnalisés, aient le bon code de sortie, les détails, les priorités, le message, etc. J'ai donc créé un petit script Bash pour m'en occuper. Le voici sur GitHub, logit.sh .
Quelques extraits:
Voici la partie du contenu du fichier temporaire:
Voici une fonction pour créer des événements dans WEVL:
Exécuter le script batch et appeler __create_event:
la source