windows - forskel i forsinket udvidelse af ERRORLEVEL på cmd prompt og win32\_process

Indlæg af Hanne Mølgaard Plasc

Problem



cmd /V:ON /c dir c:<some non existing directory> & echo \%ERRORLEVEL\%     
Volume in drive C is PC COE  Volume Serial Number is 9C37-D0B7

 Directory of c:

File Not Found 
0


Lad os køre den samme kommando ved hjælp af! for at udvide ERRORLEVEL (forsinket udvidelse er aktiveret)


cmd /V:ON /c dir c:ERt & echo !ERRORLEVEL!
 Volume in drive C is PC COE
 Volume Serial Number is 9C37-D0B7

 Directory of c:

File Not Found
!ERRORLEVEL!


Det udskriver! ERRORLEVEL !.


Dette virker fint, når jeg kører kommandoen ved hjælp af en WMI win32\_process create kommando og korrekt fejl returneres ved hjælp af! ERRORLEVEL! variabel


Hvilken forskel gør den, når den udføres i en cmd-prompt og udføres ved hjælp af WMI win32\_process.?

Bedste reference


Ved hjælp af


cmd /V:ON /c dir c:ERt & echo !ERRORLEVEL!


Den nye kommandoproces startet med cmd /V:ON udfører bare kommandoen dir c:ERt og lukker derefter og den anden kommando echo !ERRORLEVEL! udføres med den nuværende kommandoproces, hvorpå forsinket ekspansion ikke er aktiveret.


Kommandolinjen


cmd /V:ON /c "dir c:ERt & echo !ERRORLEVEL!"


skal bruges til at køre dir c:ERt OG echo !ERRORLEVEL! i en ny kommandoproces, inden du afslutter denne kommandoproces.


De dobbelte citater omkring hele kommandolinjen til at udføre i ny kommandoproces gør forskellen.


Uden de dobbelte citater omkring kommandolinjen til at udføre i ny kommandoproces tolker den nuværende kommandoproces linjen med de to kommandoer, som når du skriver


cmd /V:ON /c dir c:ERt
echo !ERRORLEVEL!


Også muligt ville være


cmd /V:ON /c dir c:ERt ^& echo !ERRORLEVEL!


Nu er operatøren & undslippet, fordi den nuværende kommandoproces fortolkes som bogstavkarakter, og derfor udføres hele linjen med karet karakter ^ fjernet af den nye kommandoproces.