Windows-batch - returfejl EXITCODE, men overlad IKKE script til mislykket instruktion

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne spørge dig om du kunne hint mig på en eller anden måde mere elegant løsning (end den, der findes i slutningen af ​​dette indlæg) til dette problem: Jeg vil køre et batch script, der hvis (i det mindste) en af ​​dens instruktioner fejler, vil fortsætte med at køre de andre instruktioner, men returnerer et fejlfelt, der angiver en fejl (siger 1).


En løsning, som jeg testede (og arbejder) er følgende:


set instructionfailed=0
**INSTRUCTION THAT WILL FAIL (ex. copy a a)**
if \%errorlevel\% == 1 set instructionfailed=1
**INSTRUCTION THAT WILL SUCCEED (ex.(supposing abcdefg does not exist) mkdir abcdefg) **
if \%errorlevel\% == 1 set instructionfailed=1
exit /b \%instructionfailed\%


EDIT: Jeg har faktisk læst (her for eksempel) at jeg måske skal bruge ERRORLEVEL i stedet for\% errorcode\%, men koden jeg skal integrere dette med synes også at bruge\% errorcode\%. [9]

Bedste reference


Der er en usædvanlig simpel teknik, der kan fungere, afhængigt af hvilke kommandoer der udføres, og en anden lidt mere kompleks teknik, som altid vil fungere.


1) Enkel løsning, der måske eller måske ikke virker, afhængigt af kommandoerne



Nogle interne kommandoer indstiller kun ERRORLEVEL, hvis og kun, hvis der opstod en fejl, og nogle angiver altid ERRORLEVEL efter succes eller fejl. Eksterne kommandoer indstiller altid ERRORVEL.


Så hvis alle dine kommandoer er interne kommandoer, som ikke rydder ERRORLEVEL efter succes, kan du blot rydde ERRORLEVEL i starten og derefter køre hver kommando i rækkefølge . Fejlfeltet vil kun være ikke-nul (angiver en fejl), hvis en af ​​kommandoerne mislykkedes. Du kan blot udstede EXIT /B i slutningen, og den aktuelle ERRORLEVEL vil blive returneret.


En arcan men hurtig måde at rydde ERRORLEVEL til 0 ved starten er at bruge (call ) - det bageste rum er kritisk.


(call )
internalCommand1
internalCommand2
...
internalCommandN
exit /b


En liste over interne kommandoer, der kan fungere med denne løsning, kan findes ved hvilke cmd.exe interne kommandoer, rydder ERRORLEVEL til 0 efter succes ?. Igen, for at denne løsning skal fungere, vil du have de interne kommandoer, som ikke rydder ERRORLEVEL efter succes.


2) Lidt mere kompleks løsning, som altid virker



Ligesom med din nuværende løsning indstiller du din egen fejlvariabel til 0 ved starten og sætter betinget det til null ved fejl efter hver kommando. Men i stedet for at bruge if errorlevel 1 eller if \%errorlevel\% neq 0, kan du bruge den betingede || kommandoforbindelsesoperatør, som kun udfører kommandoen, hvis den foregående fejlede.


set "err=0"
anyCommand1 || set "err=1"
anyCommand2 || set "err=1"
...
anyCommandN || set "err=1"
exit /b \%err\%