Kør to kommandoer i en Windows CMD-linje, en kommando er SET-kommando

Indlæg af Hanne Mølgaard Plasc

Problem



[[formål]]



Denne enkle kommandosekvens kører forventet i Windows 'CMD shell:


dir & echo hello


vil liste filerne og mapper og ekko strengen.


Den følgende kommandosekvens løber dog ikke som forventet (i hvert fald af mig):


C:UsersAdministrator>set name=value & echo \%name\%
\%name\%

C:UsersAdministrator>echo \%name\%
value

C:UsersAdministrator>


Som vi kan se, kan det første ekko ikke få miljøet. Kan du hjælpe med at kommentere? Enhver kommentar vil blive værdsat!


PS: OS: Windows 7 X64 Home Pre

Bedste reference


Dit resultat skyldes, at\% name\% er udvidet i parsingsfasen, og hele linjen analyseres på én gang, før værdien indstilles.


Du kan få den aktuelle værdi på samme linje som den indstillede kommando på en af ​​to måder.


1) brug CALL til at få ECHO\% NAME NAME til at blive analyseret en 2. gang:


set name=value&call echo \%^name\%


Jeg sætter en ^ mellem procentene, bare hvis navnet allerede var defineret, før linjen blev udført. Uden caret ville du få den gamle værdi.


Bemærk: Din oprindelige linje havde en plads før &, dette rum ville blive inkluderet i værdien af ​​variablen. Du kan forhindre det ekstra rum ved at bruge citater: set "name=value" &...


2) brug forsinket ekspansion for at få værdien ved udførelsestid i stedet for at analysere tid. De fleste miljøer har ikke forsinket ekspansion aktiveret som standard. Du kan aktivere forsinket udvidelse på kommandolinjen ved at bruge den relevante CMD.EXE-indstilling.


cmd /v:on
set "name=value" & echo !name!


Forsinket ekspansion kan bestemt bruges på kommandolinjen, men det bruges hyppigere i en batchfil. SETLOCAL bruges til at aktivere forsinket ekspansion inden for en batchfil (det virker ikke fra kommandolinjen)


setlocal enableDelayedExpansion
set "name=value" & echo !name!

Andre referencer 1


Du kan også bruge cmd /V /C (med /V for at aktivere forsinket ekspansion).

Det er dejligt at indstille en miljøvariabel for kun én kommando i Windows cmd.exe:


cmd /V /C "set "name=value" && echo !name!"
value


Bemærk brugen af ​​dobbelt citater i set "name=value" for at undgå ekstra plads efter value.

For eksempel uden dobbelt citater:


cmd /V /C "set name=value && echo '!name!'"
'value '


Du skulle tænke for at fjerne mellemrummet mellem value og &&:


cmd /V /C "set name=value&& echo '!name!'"
'value'


Men ved hjælp af dobbelt citater gør opgaven mere eksplicit.