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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow