Zoeken…


Verklaring

Gebruik de opdracht SET om een eenvoudige variabele te maken en aan een waarde of tekenreeks toe te wijzen:

SET var=10

Hier declareert de code een nieuwe variabele var met een waarde van 10 . Standaard worden alle variabelen intern opgeslagen als tekenreeksen; dit betekent dat de waarde 10 niet anders is dan foo1234 of Hello, World!

Opmerkingen over aanhalingstekens

De gebruikte aanhalingstekens worden opgenomen in de waarde van de variabele:

SET var="new value"             <-- %var% == '"new value"'

Spaties in variabelen

Batchtaal beschouwt spaties als acceptabele delen van variabelenamen. set var = 10 resulteert bijvoorbeeld in een variabele met de naam var die de waarde 10 bevat (let op de extra ruimte rechts van var en links van de 10).

Aanhalingstekens gebruiken om spaties te verwijderen

Gebruik aanhalingstekens rond de hele opdracht om spaties te voorkomen; de variabelenaam en -waarde. Dit voorkomt ook onbedoelde volgspaties aan het einde van de regel (het teken geeft een spatie aan):

SET␣var=my␣new␣value␣           <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣         <-- '%var%' == 'my new value'

Gebruik ook aanhalingstekens wanneer u meerdere uitspraken samenvoegt met & of | - plaats anders het symbool direct na het einde van de waarde van de variabele:

SET var=val & goto :next        <-- '%var%' == 'val '
SET "var=val" & goto :next      <-- '%var%' == 'val'
SET var=val& goto :next         <-- '%var%' == 'val'

Gebruik

echo %var%

Deze code weerspiegelt de waarde van var

Als setLocal EnableDelayedExpansion wordt gebruikt, zal het volgende de waarde van var echoën (de standaarduitdrukking% var% zal in die context niet werken).

echo !var!

In batchbestanden kunnen variabelen in elke context worden gebruikt, ook als delen van opdrachten of delen van andere variabelen. U mag een variabele niet aanroepen voordat u deze definieert.

Variabelen gebruiken als opdrachten:

set var=echo
%var% This will be echoed

Variabelen gebruiken in andere variabelen:

set var=part1
set %var%part2=Hello
echo %part1part2%

Variabele vervanging

In tegenstelling tot andere programmeertalen wordt een variabele in een batchbestand vervangen door de werkelijke waarde voordat het batchscript wordt uitgevoerd. Met andere woorden, de vervanging vindt plaats wanneer het script door de opdrachtprocessor in het geheugen wordt gelezen , niet wanneer het script later wordt uitgevoerd .

Dit maakt het gebruik van variabelen mogelijk als commando's in het script, en als onderdeel van andere variabelenamen in het script, enz. Het "script" in deze context is een regel - of blok - van code, omgeven door ronde haken: () .

Maar dit gedrag betekent wel dat je de waarde van een variabele niet binnen een blok kunt wijzigen!

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    ECHO %VAR%
    SET VAR=Goodbye
)

zal afdrukken

Hello
Hello

omdat (zoals u ziet bij het bekijken van het script in het opdrachtvenster) het wordt geëvalueerd om:

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo Hello
    SET VAR=Goodbye
)

In het bovenstaande voorbeeld wordt de ECHO opdracht geëvalueerd als Hello wanneer het script in het geheugen wordt ingelezen, dus het script zal voor altijd Hello echoën, hoewel er veel passages door het script worden gemaakt.

De manier om het meer "traditionele" variabele gedrag (van de variabele die wordt uitgebreid terwijl het script wordt uitgevoerd) te bereiken, is door "vertraagde uitbreiding" in te schakelen. Dit omvat het toevoegen van dat commando in het script voorafgaand aan de lusinstructie (meestal een FOR-lus, in een batch-script) en het gebruik van een uitroepteken (!) In plaats van een procentteken (%) in de naam van de variabele:

setlocal enabledelayedexpansion 
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo !VAR!
    SET VAR=Goodbye
)
endlocal

zal afdrukken

Hello
Goodbye

De syntaxis %%a in (1,1,2) zorgt ervoor dat de lus 2 keer wordt uitgevoerd: bij de eerste gelegenheid draagt de variabele de beginwaarde 'Hallo', maar bij de tweede doorgang door de lus - na de tweede te hebben uitgevoerd SET-instructie als de laatste actie bij de 1e doorgang - deze is gewijzigd in de herziene waarde 'Tot ziens'.

Geavanceerde variabele vervanging

Nu een geavanceerde techniek. Met behulp van de opdracht CALL kan de batchopdrachtprocessor een variabele op dezelfde regel van het script uitbreiden. Dit kan uitbreiding op meerdere niveaus opleveren, door herhaald gebruik van CALL en modifier.

Dit is handig in bijvoorbeeld een FOR-lus. Zoals in het volgende voorbeeld, waar we een genummerde lijst met variabelen hebben:

"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"

We kunnen dit bereiken met behulp van de volgende FOR-lus:

setlocal enabledelayedexpansion
for %%x in (%*) do (
    set /a "i+=1"
    call set path!i!=%%~!i!
    call echo %%path!i!%%
)
endlocal

Output:

c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt

Merk op dat de variabele !i! wordt eerst uitgebreid naar de oorspronkelijke waarde 1, en vervolgens wordt de resulterende variabele% 1 uitgebreid naar de werkelijke waarde van c:\MyFiles\test1.txt . Dit is een dubbele uitbreiding van de variabele i . Op de volgende regel wordt i opnieuw dubbel uitgebreid, met behulp van de opdracht CALL ECHO samen met het prefix %% variabele en vervolgens op het scherm afgedrukt (dwz op het scherm weergegeven).

Bij elke opeenvolgende doorloop door de lus wordt het initiële nummer met 1 verhoogd (vanwege de code i+=1 ). Dus neemt het toe tot 2 bij de 2e doorgang door de lus en tot 3 bij de 3e doorgang. Dus de reeks echode naar het scherm verandert met elke pass.

Declareer meerdere variabelen

Wanneer aan het begin van de batch meerdere variabelen zijn gedefinieerd, kan een korte definitie worden gebruikt door een vervangende string te gebruiken.

@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

Merk op dat in het bovenstaande voorbeeld variabelen alfabetisch gesorteerd zijn, wanneer ze op het scherm worden afgedrukt.

Een variabele gebruiken als een array

Het is mogelijk om een set variabelen te maken die vergelijkbaar kunnen zijn met een array (hoewel ze geen daadwerkelijk arrayobject zijn) door spaties in de SET instructie te gebruiken:

@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
    echo %%a
)
echo Get the variable directly: %var%

Resultaat:

A
"foo bar"
123
Get the variable directly: A "foo bar" 123

Het is ook mogelijk om uw variabele te declareren met behulp van indexen, zodat u specifieke informatie kunt ophalen. Dit creëert meerdere variabelen, met de illusie van een array:

@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]%

Resultaat:

A
foo bar
123
Get one of the variables directly: foo bar

Merk op dat in het bovenstaande voorbeeld u niet naar var kunt verwijzen zonder te vermelden wat de gewenste index is, omdat var zichzelf niet bestaat. Dit voorbeeld gebruikt ook setlocal enabledelayedexpansion in combinatie met de uitroeptekens op !var[%%a]! . Meer informatie hierover kunt u vinden in de Variable Substitution Scope Documentation .

Bewerkingen op variabelen

set var=10
set /a var=%var%+10
echo %var%

De uiteindelijke waarde van var is 20.

De tweede regel werkt niet binnen een opdrachtblok dat bijvoorbeeld wordt gebruikt in een IF- toestand of in een FOR- lus, omdat een vertraagde uitbreiding nodig is in plaats van een standaard uitbreiding van de omgevingsvariabele.

Hier is een andere, betere manier om ook in een opdrachtblok te werken:

set var=10
set /A var+=10
echo %var%

De opdrachtpromptomgeving ondersteunt met ondertekende 32-bits gehele waarden:

  • toevoeging + en +=
  • aftrekken - en -=
  • vermenigvuldiging * en *=
  • divisie / en /=
  • modulus deling % en %=
  • beetje bij beetje EN &
  • beetje bij beetje OF |
  • beetje bij beetje NIET ~
  • beetje XOR ^
  • beetje naar links verschuiven <<
  • bitgewijs rechts verschuiven >>
  • logisch NIET !
  • unary min -
  • groeperen met ( en )

De Windows-opdrachtinterpreter ondersteunt geen 64-bits gehele getallen of drijvende-kommawaarden in rekenkundige uitdrukkingen.

Opmerking: de operator % moet in een batchbestand worden geschreven als %% om als operator te kunnen worden geïnterpreteerd.

In een opdrachtpromptvenster dat de opdrachtregelset uitvoert set /A Value=8 % 3 wijst de waarde 2 aan omgevingsvariabele Value en voert bovendien 2 .

In een batchbestand moet worden geschreven set /A Value=8 %% 3 om de waarde 2 toe te wijzen aan omgevingsvariabele Value en er wordt niets uitgevoerd respectievelijk geschreven om STDOUT af te handelen (standaarduitvoer). Een regelset set /A Value=8 % 3 in een batchbestand zou resulteren in een foutmelding Ontbrekende operator bij uitvoering van het batchbestand.

De omgeving vereist de schakelaar /A voor rekenkundige bewerkingen, niet voor gewone tekenreeksvariabelen.

Elke tekenreeks in de rekenkundige uitdrukking na set /A is of een nummer of een operator automatisch wordt geïnterpreteerd als de naam van een omgevingsvariabele.

Om die reden wordt verwezen naar de waarde van een variabele met %variable% of met !variable! is niet nodig als de variabelenaam alleen uit woordtekens (0-9A-Za-z_) bestaat, waarbij het eerste teken geen cijfer is, wat vooral handig is in een opdrachtblok dat begint met ( en eindigt op een overeenkomst ) .

Getallen worden geconverteerd van string naar geheel getal met C / C ++ functie strtol met base nul. Dit betekent automatische basisbepaling die gemakkelijk kan resulteren in onverwachte resultaten.

Voorbeeld:

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%

De output van dit voorbeeld is:

11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4

Variabelen die niet zijn gedefinieerd bij de evaluatie van de rekenkundige uitdrukking worden vervangen door waarde 0.

Variabelen instellen van een invoer

Met de /p schakelaar met het SET commando kunt u variabelen van een ingang definiëren.

Deze invoer kan een gebruikersinvoer (toetsenbord) zijn:

echo Enter your name : 
set /p name=
echo Your name is %name%

Die zo kan worden vereenvoudigd:

set /p name=Enter your name :
echo Your name is %name%

Of u kunt de invoer uit een bestand halen:

set /p name=< file.txt

in dit geval krijgt u de waarde van de eerste regel van file.txt

De waarde van verschillende regels in een bestand ophalen:

(
   set /p line1=
   set /p line2=
   set /p line3=

) < file.txt


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow