batch-file
Variabler i batchfiler
Sök…
Deklaration
För att skapa en enkel variabel och tilldela den till ett värde eller en sträng använder du SET
kommandot:
SET var=10
Här förklarar koden en ny variabel var
med ett värde på 10
. Som standard lagras alla variabler internt som strängar; detta betyder att värdet 10
inte skiljer sig från foo1234
eller Hello, World!
Anteckningar om citattecken
Citatmärken som används kommer att inkluderas i variabelns värde:
SET var="new value" <-- %var% == '"new value"'
Utrymmen i variabler
Batchspråk anser att mellanslag är godtagbara delar av variabla namn. Till exempel kommer set var = 10
att resultera i en variabel som heter var
som innehåller värdet 10
(notera det extra utrymmet till höger om var och till vänster om 10).
Använd citattecken för att eliminera mellanslag
För att förhindra mellanslag använder du citattecken runt hela uppdraget. variabelns namn och värde. Detta förhindrar också oavsiktliga efterföljande utrymmen i slutet av linjen ( ␣
tecknet anger ett mellanrum):
SET␣var=my␣new␣value␣ <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣ <-- '%var%' == 'my new value'
Använd också citattecken när du går med i flera uttalanden med &
eller |
- alternativt sätta symbolen direkt efter slutet av variabelns värde:
SET var=val & goto :next <-- '%var%' == 'val '
SET "var=val" & goto :next <-- '%var%' == 'val'
SET var=val& goto :next <-- '%var%' == 'val'
Användande
echo %var%
Den här koden kommer att eko värdet på var
Om setLocal EnableDelayedExpansion
används, kommer följande att eko värdet på var
(standarduttrycket% var% fungerar inte i det sammanhanget).
echo !var!
I batchfiler kan variabler användas i alla sammanhang, inklusive som delar av kommandon eller delar av andra variabler. Du får inte ringa en variabel innan du definierar den.
Använda variabler som kommandon:
set var=echo
%var% This will be echoed
Använda variabler i andra variabler:
set var=part1
set %var%part2=Hello
echo %part1part2%
Variabel substitution
Till skillnad från andra programmeringsspråk ersätts en variabel i en batchfil med dess verkliga värde innan batchskriptet körs. Med andra ord görs ersättningen när skriptet läses in i minnet av kommandoprocessorn, inte när skriptet senare körs .
Detta möjliggör användning av variabler som kommandon i skriptet, och som en del av andra variabla namn i skriptet, etc. "Skriptet" i detta sammanhang är en rad - eller block - av kod, omgiven av runda parenteser: ()
.
Men detta beteende betyder att du inte kan ändra en variabelns värde i ett block!
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
ECHO %VAR%
SET VAR=Goodbye
)
kommer att skriva ut
Hello
Hello
eftersom (som ni ser, när man tittar på skriptet körs i kommandofönstret) utvärderas det till:
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo Hello
SET VAR=Goodbye
)
I exemplet ovan utvärderas ECHO
kommandot som Hello
när skriptet läses in i minnet, så skriptet kommer att återkalla Hello
alltid, men många pass görs genom skriptet.
Sättet att uppnå det mer "traditionella" variabla beteendet (av variabeln som expanderas medan skriptet körs) är att möjliggöra "försenad expansion". Detta innebär att lägga till det kommandot i skriptet före loopinstruktionen (vanligtvis en FOR-slinga, i ett batchskript), och att använda ett utropstecken (!) Istället för ett procenttecken (%) i variabelns namn:
setlocal enabledelayedexpansion
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo !VAR!
SET VAR=Goodbye
)
endlocal
kommer att skriva ut
Hello
Goodbye
Syntaxen %%a in (1,1,2)
får slingan att köras två gånger: vid första tillfället bär variabeln sitt ursprungliga värde "Hej", men på den andra passera genom slingan - efter att ha utfört den andra Ställ in instruktion som den sista åtgärden på 1: a passet - detta har ändrats till det reviderade värdet 'Goodbye'.
Avancerad variabel substitution
Nu, en avancerad teknik. Med hjälp av CALL
kommandot kan batchkommandoprocessorn utvidga en variabel som ligger på samma rad i skriptet. Detta kan ge flera nivåer expansion genom upprepad användning av CALL och modifierare.
Detta är användbart i till exempel en FOR-slinga. Som i följande exempel, där vi har en numrerad lista med variabler:
"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"
Vi kan uppnå detta med hjälp av följande FOR-slinga:
setlocal enabledelayedexpansion
for %%x in (%*) do (
set /a "i+=1"
call set path!i!=%%~!i!
call echo %%path!i!%%
)
endlocal
Produktion:
c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt
Observera att variabeln !i!
utvidgas först till dess initialvärde, 1, sedan utvidgas den resulterande variabeln,% 1, till dess verkliga värde på c:\MyFiles\test1.txt
. Detta är dubbel expansion av variabeln i
. På nästa rad utvidgas i
igen dubbel med hjälp av kommandot CALL ECHO
tillsammans med prefixet %%
variabel och sedan skrivs ut på skärmen (dvs. visas på skärmen).
På varje på varandra följande pass genom slingan ökas det initiala antalet med 1 (på grund av koden i+=1
). Således ökar det till 2
på 2: a passet genom slingan och till 3
på 3: e passet. Således ekra strängen till skärmen förändras med varje pass.
Förklara flera variabler
När flera variabler definieras i början av partiet, kan en form med kort definition användas genom att använda en ersättningssträng .
@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"
for /f %%l in ('set _') do echo %%l
exit /b
_A=good
_D=6
_E=bad
_G=ugly
Observera i exemplet ovan, variabler sorteras alfabetiskt i alfabetet när de skrivs ut på skärmen.
Använda en variabel som en matris
Det är möjligt att skapa en uppsättning variabler som kan fungera som en matris (även om de inte är ett faktiskt arrayobjekt) genom att använda mellanslag i SET
uttalandet:
@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
echo %%a
)
echo Get the variable directly: %var%
Resultat:
A
"foo bar"
123
Get the variable directly: A "foo bar" 123
Det är också möjligt att deklarera din variabel med index så att du kan hämta specifik information. Detta kommer att skapa flera variabler, med en illusion av en matris:
@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%
Resultat:
A
foo bar
123
Get one of the variables directly: foo bar
Observera att i exemplet ovan kan du inte hänvisa till var
utan att ange vad det önskade indexet är, eftersom var
inte existerar i sig. I det här exemplet används setlocal enabledelayedexpansion
i kombination med utropstecken vid !var[%%a]!
. Du kan se mer information om detta i Variable Substitution Scope Documentation .
Verksamhet på variabler
set var=10
set /a var=%var%+10
echo %var%
Det slutliga värdet på var
är 20.
Den andra raden fungerar inte inom ett kommandoblock som används till exempel på ett IF- tillstånd eller i en FOR- slinga eftersom försenad expansion skulle behövas istället för standardmiljövariabel expansion.
Här är ett annat, bättre sätt att arbeta också i ett kommandoblock:
set var=10
set /A var+=10
echo %var%
Kommandotolkmiljön stöder med signerade 32-bitars heltal:
- tillägg
+
och+=
- subtraktion
-
och-=
- multiplikation
*
och*=
- uppdelning
/
och/=
- modulindelning
%
och%=
- bitvis OCH
&
- bitvis ELLER
|
- bitvis INTE
~
- bitvis XOR
^
- bitvis vänster skift
<<
- bitvis höger växel
>>
- logiskt INTE
!
- unary minus
-
- gruppera med
(
och)
Windows-kommandotolkaren stöder inte 64-bitars heltal eller flytande punktvärden i aritmetiska uttryck.
Obs: Operatören %
måste skrivas i en batchfil som %%
för att tolkas som operatör.
I ett kommandotolkfönster exekverar kommandoradsuppsättningen set /A Value=8 % 3
tilldelar värdet 2
till miljövariabeln Value
och dessutom matar ut 2
.
I en batchfil måste skrivas set /A Value=8 %% 3
att tilldela värdet 2
till miljövariabeln Value
och ingenting skrivs ut respektive skrivs för att hantera STDOUT (standardutgång). En raduppsättning set /A Value=8 % 3
i en batchfil skulle resultera i felmeddelande Saknas operatör vid körning av batchfilen.
Miljön kräver omkopplaren /A
för aritmetiska operationer, inte för vanliga strängvariabler.
Varje sträng i det aritmetiska uttrycket efter set /A
är huruvida ett nummer eller en operatör automatiskt tolkas som namn på en miljövariabel.
Av den anledningen hänvisar vi till värdet på en variabel med %variable%
eller med !variable!
är inte nödvändigt när variabelnamnet endast består av ordtecken (0-9A-Za-z_) där det första tecknet inte är en siffra som är särskilt användbart i ett kommandoblock som börjar med (
och slutar med en matchning )
.
Siffror konverteras från sträng till heltal med C / C ++ -funktion strtol med base
är noll vilket betyder automatisk basbestämning som lätt kan resultera i oväntade resultat.
Exempel:
set Divided=11
set Divisor=3
set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor
echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%
set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3
echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%
set /A Result%%=7
echo -90 %%= 7 = %Result%
set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue
echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%
Utgången från detta exempel är:
11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4
Variabler som inte definieras vid utvärdering av det aritmetiska uttrycket ersätts med värdet 0.
Ställa in variabler från en ingång
Med omkopplaren /p
med SET
kommandot kan du definiera variabler från en ingång.
Denna ingång kan vara en användarinmatning (tangentbord):
echo Enter your name :
set /p name=
echo Your name is %name%
Vilket kan förenklas så här:
set /p name=Enter your name :
echo Your name is %name%
Eller så kan du få inmatningen från en fil:
set /p name=< file.txt
i det här fallet får du värdet på den första raden från file.txt
Få värdet på olika rader i en fil:
(
set /p line1=
set /p line2=
set /p line3=
) < file.txt