Kaip gauti išėjimo kodą iš „Windows“ komandų eilutės?

Paleidžiu programą ir noriu matyti jo grąžinimo kodą (kadangi jis grąžina skirtingus kodus, pagrįstus skirtingomis klaidomis).

Aš žinau, kad Basho aš galiu tai padaryti paleisdamas

echo $?

Ką daryti naudojant „cmd.exe“ sistemoje „Windows“?

676
02 дек. Skrud yra nustatytas 02 dec. 2008-12-02 21:04 '08 at 9:04 pm 2008-12-02 21:04
@ 7 atsakymai

Pseudo aplinkos kintamasis, pavadintas „ errorlevel saugo išėjimo kodą:

 echo Exit Code is %errorlevel% 

Be to, if komanda turi specialią sintaksę:

 if errorlevel 

Žiūrėkite, if/? dėl išsamesnės informacijos.

pavyzdys

 @echo off my_nify_exe.exe if errorlevel 1 ( echo Failure Reason Given is %errorlevel% exit /b %errorlevel% ) 

Įspėjimas: jei nustatysite errorlevel aplinkos errorlevel , %errorlevel% grąžins šią vertę, o ne %errorlevel% kodą. Naudokite ( set errorlevel= ), kad išvalytumėte aplinkos kintamąjį, suteikdami prieigą prie tikros errorlevel vertės per %errorlevel% aplinkos kintamąjį.

821
02 дек. Atsakymas, kurį pateikė Samuel Renkert 02 Dec 2008-12-02 21:07 '08, 21:07 2008-12-02 21:07

Testavimas ErrorLevel veikia konsolės programoms, tačiau, kaip nurodė dmihailescu , jis neveikia, jei bandote paleisti >ErrorLevel nulis, nurodant, kad procesas buvo sėkmingai sukurtas). Kai baigiama >

Tačiau, užuot naudoję kitur minėtą C + + paleidiklį, paprastesnė alternatyva yra pradėti >START/WAIT . Taip bus paleista >ErrorLevel .

border=0
 start /wait something.exe echo %errorlevel% 
211
13 июля '12 в 21:57 2012-07-13 21:57 atsakymą pateikė Gary liepos 12 d., 12:57 2012-07-13 21:57

Naudokite įmontuotą kintamąjį ERRORLEVEL:

 echo %ERRORLEVEL% 

Bet būkite atsargūs, jei programa apibrėžė aplinkos kintamąjį, pavadintą ERRORLEVEL !

89
02 дек. atsakymą pateikė Adam Rosenfield 02 d. 2008-12-02 21:09 '08 at 9:09 pm 2008-12-02 21:09

Jei norite tiksliai atitikti klaidos kodą (pvz., Tai yra 0), naudokite:

 @echo off my_nify_exe.exe if %ERRORLEVEL% EQU 0 ( echo Success ) else ( echo Failure Reason Given is %errorlevel% exit /b %errorlevel% ) 

if errorlevel 0 atitinka errorlevel > = 0. Žiūrėkite, if/? ,

13
29 июля '14 в 19:08 2014-07-29 19:08 atsakymą įteikė Curtis Yallop , liepos 29 d. 14, 19:08 2014-07-29 19:08

Jis gali neveikti tinkamai, jei naudojate programą, kuri nėra prijungta prie konsolės, nes ši programa gali veikti tol, kol manote, kad turite išėjimo kodą. Šiam sprendimui C ++ yra toks sprendimas:

13
25 июня '10 в 20:05 2010-06-25 20:05 atsakymas dmihailescu pateikiamas birželio 25 d. 10 val. 20:05 2010-06-25 20:05

Verta pažymėti, kad GPGB ir .CMD failai veikia skirtingai.

Skaitydami https://ss64.com/nt/errorlevel.html pažymima:

Yra esminis skirtumas tarp .CDD ir .BAT rinkmenų, nustatančių klaidų lygius:

Senasis GPGB scenarijus, vykdantis „naujas“ vidines komandas: APPEND, ASSOC, PATH, PROMPT, FTYPE ir SET įdiegs ERRORLEVEL tik esant klaidai. Todėl, jei turite dvi komandas partijos scenarijuje ir pirmasis gedimas, ERRORLEVEL bus įdiegtas net ir sėkmingai atlikus antrąją komandą.

Dėl to gali būti sunku ištaisyti problemas, susijusias su GPGB scenarijumi, partijos CMD scenarijus yra nuoseklesnis ir įdiegs ERRORLEVEL po kiekvienos komandos, kurią paleisite [šaltinis].

Tai man nepadarė jokio liūdesio, nes aš einau iš eilės komandas, tačiau ERRORLEVEL nepasikeitė net nesėkmės atveju.

2
18 сент. Atsakymas duotas RockDoctor 18 sep . 2018-09-18 09:13 '18, 09:13 2018-09-18 09:13

Tam tikru momentu reikėjo tiksliai perkelti žurnalo įvykius iš „Cygwin“ į „Windows“ įvykių žurnalą. Norėjau, kad WEVL pranešimai būtų normalūs, turi tinkamą išėjimo kodą, informaciją, prioritetus, pranešimą ir pan. Taigi sukūriau mažą „Bash“ scenarijų, kad tai pasirūpintumėte. Čia jis yra GitHub, logit.sh .

Kai kurios ištraukos:

 usage: logit.sh [-h] [-p] [-i=n] [-s] <description> example: logit.sh -p error -i 501 -s myscript.sh "failed to run the mount command" 

Štai keletas laikino failo turinio:

 LGT_TEMP_FILE="$(mktemp --suffix .cmd)" cat<<EOF>$LGT_TEMP_FILE @echo off set LGT_EXITCODE="$LGT_ID" exit /b %LGT_ID% EOF unix2dos "$LGT_TEMP_FILE" 

Čia yra įvykių kūrimo funkcija WEVL:

 __create_event () { local cmd="eventcreate /ID $LGT_ID /L Application /SO $LGT_SOURCE /T $LGT_PRIORITY /D " if [[ "$1" == *';'* ]]; then local IFS=';' for i in "$1"; do $cmd "$i"  done else $cmd "$LGT_DESC"  fi } 

Vykdykite scenarijaus paketą ir paskambinkite __create_event:

 cmd /c "$(cygpath -wa "$LGT_TEMP_FILE")" __create_event 
0
28 февр. jonretting atsakymas 28 Vas 2015-02-28 22:33 '15, 10:33 pm 2015-02-28 22:33