batch-file
Zmienne w plikach wsadowych
Szukaj…
Deklaracja
Aby utworzyć prostą zmienną i przypisać ją do wartości lub łańcucha, użyj polecenia SET
:
SET var=10
Tutaj kod deklaruje nową zmienną var
o wartości 10
. Domyślnie wszystkie zmienne są przechowywane wewnętrznie jako ciągi; oznacza to, że wartość 10
nie różni się od foo1234
lub Hello, World!
Uwagi na temat cudzysłowów
Używane znaki cudzysłowu zostaną uwzględnione w wartości zmiennej:
SET var="new value" <-- %var% == '"new value"'
Odstępy w zmiennych
Język wsadowy uznaje spacje za akceptowalne części nazw zmiennych. Na przykład set var = 10
da zmienną o nazwie var
która zawiera wartość 10
(zwróć uwagę na dodatkowe spacje po prawej stronie var i po lewej stronie 10).
Używanie cudzysłowów w celu eliminacji spacji
Aby uniknąć spacji, użyj cudzysłowu wokół całego zadania; nazwa i wartość zmiennej. Zapobiega to także przypadkowym końcowym spacjom na końcu linii (znak ␣
oznacza spację):
SET␣var=my␣new␣value␣ <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣ <-- '%var%' == 'my new value'
Ponadto używaj cudzysłowów podczas łączenia wielu instrukcji za pomocą &
lub |
- alternatywnie umieść symbol bezpośrednio za końcem wartości zmiennej:
SET var=val & goto :next <-- '%var%' == 'val '
SET "var=val" & goto :next <-- '%var%' == 'val'
SET var=val& goto :next <-- '%var%' == 'val'
Stosowanie
echo %var%
Ten kod powtórzy wartość var
Jeśli zostanie użyta funkcja setLocal EnableDelayedExpansion
, następujące polecenie wyświetli wartość var
(standardowe wyrażenie% var% nie będzie działać w tym kontekście).
echo !var!
W plikach wsadowych zmiennych można używać w dowolnym kontekście, w tym jako części poleceń lub części innych zmiennych. Nie możesz wywołać zmiennej przed jej zdefiniowaniem.
Używanie zmiennych jako poleceń:
set var=echo
%var% This will be echoed
Używanie zmiennych w innych zmiennych:
set var=part1
set %var%part2=Hello
echo %part1part2%
Zmienna zamiana
W przeciwieństwie do innych języków programowania, w pliku wsadowym zmienną zastępuje się jej rzeczywistą wartością przed uruchomieniem skryptu wsadowego. Innymi słowy, podstawienie jest dokonywane, gdy skrypt jest wczytywany do pamięci przez procesor poleceń, a nie kiedy skrypt jest później uruchamiany .
Umożliwia to stosowanie zmiennych jako poleceń w skrypcie oraz jako część innych nazw zmiennych w skrypcie itp. „Skrypt” w tym kontekście jest linią - lub blokiem kodu, otoczony nawiasami okrągłymi: ()
.
Ale to zachowanie oznacza, że nie można zmienić wartości zmiennej w bloku!
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
ECHO %VAR%
SET VAR=Goodbye
)
wydrukuje
Hello
Hello
ponieważ (jak widać, podczas oglądania skryptu uruchamianego w oknie poleceń) jest oceniane:
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo Hello
SET VAR=Goodbye
)
W powyższym przykładzie komenda ECHO
jest oceniana jako Hello
gdy skrypt jest wczytywany do pamięci, więc skrypt będzie powtarzał Hello
zawsze, niezależnie od tego, ile skryptów jest wykonywanych.
Sposobem na osiągnięcie bardziej „tradycyjnego” zachowania zmiennej (zmiennej rozwijanej podczas działania skryptu) jest włączenie „opóźnionej ekspansji”. Obejmuje to dodanie tego polecenia do skryptu przed instrukcją pętli (zwykle pętla FOR, w skrypcie wsadowym) i użycie wykrzyknika (!) Zamiast znaku procentu (%) w nazwie zmiennej:
setlocal enabledelayedexpansion
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo !VAR!
SET VAR=Goodbye
)
endlocal
wydrukuje
Hello
Goodbye
Składnia %%a in (1,1,2)
powoduje, że pętla działa 2 razy: przy pierwszej okazji zmienna nosi swoją początkową wartość „Hello”, ale przy drugim przejściu przez pętlę - wykonawszy drugą Instrukcja SET jako ostatnia akcja przy pierwszym przejściu - zmieniła się na zmienioną wartość „Do widzenia”.
Zaawansowane podstawianie zmiennych
Teraz zaawansowana technika. Użycie polecenia CALL
pozwala procesorowi poleceń wsadowych rozwinąć zmienną znajdującą się w tym samym wierszu skryptu. Może to zapewnić ekspansję wielopoziomową poprzez wielokrotne wywoływanie CALL i użycie modyfikatora.
Jest to przydatne na przykład w pętli FOR. Jak w poniższym przykładzie, gdzie mamy ponumerowaną listę zmiennych:
"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"
Możemy to osiągnąć za pomocą następującej pętli FOR:
setlocal enabledelayedexpansion
for %%x in (%*) do (
set /a "i+=1"
call set path!i!=%%~!i!
call echo %%path!i!%%
)
endlocal
Wynik:
c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt
Zauważ, że zmienna !i!
jest najpierw rozwijany do wartości początkowej 1, a następnie zmienna wynikowa,% 1, jest rozwijana do wartości rzeczywistej c:\MyFiles\test1.txt
. Jest to podwójne rozwinięcie zmiennej i
. W następnym wierszu i
jest ponownie podwójnie rozwinięte za pomocą polecenia CALL ECHO
wraz z prefiksem zmiennej %%
, a następnie drukowane na ekranie (tj. Wyświetlane na ekranie).
Przy każdym kolejnym przejściu przez pętlę liczba początkowa jest zwiększana o 1 (ze względu na kod i+=1
). Zatem wzrasta do 2
przy drugim przejściu przez pętlę i do 3
przy trzecim przejściu. Zatem ciąg echa na ekranie zmienia się z każdym przejściem.
Zadeklaruj wiele zmiennych
Jeśli na początku partii zdefiniowano wiele zmiennych, można zastosować krótką definicję, stosując ciąg zastępujący .
@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
Uwaga: w powyższym przykładzie zmienne są natywnie sortowane alfabetycznie po wydrukowaniu na ekranie.
Używanie zmiennej jako tablicy
Możliwe jest utworzenie zestawu zmiennych, które mogą działać podobnie do tablicy (chociaż nie są rzeczywistym obiektem tablicy), używając spacji w instrukcji SET
:
@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
echo %%a
)
echo Get the variable directly: %var%
Wynik:
A
"foo bar"
123
Get the variable directly: A "foo bar" 123
Możliwe jest również zadeklarowanie zmiennej za pomocą indeksów, aby można było uzyskać określone informacje. Spowoduje to utworzenie wielu zmiennych z iluzją tablicy:
@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]%
Wynik:
A
foo bar
123
Get one of the variables directly: foo bar
Zauważ, że w powyższym przykładzie nie można odwoływać się do var
bez określenia, jaki jest pożądany indeks, ponieważ var
nie istnieje sam w sobie. W tym przykładzie użyto również setlocal enabledelayedexpansion
w połączeniu z wykrzyknikami w !var[%%a]!
setlocal enabledelayedexpansion
!var[%%a]!
. Więcej informacji na ten temat można znaleźć w dokumentacji zakresu zmiennego zastępowania .
Operacje na zmiennych
set var=10
set /a var=%var%+10
echo %var%
Ostateczna wartość var
wynosi 20.
Drugi wiersz nie działa w bloku poleceń używanym na przykład w warunku IF lub w pętli FOR , ponieważ zamiast standardowego rozszerzenia zmiennej środowiskowej konieczne byłoby opóźnione rozszerzenie.
Oto kolejny lepszy sposób pracy również w bloku poleceń:
set var=10
set /A var+=10
echo %var%
Środowisko wiersza polecenia obsługuje 32-bitowe wartości całkowite ze znakiem:
- dodanie
+
i+=
- odejmowanie
-
i-=
- mnożenie
*
i*=
- podział
/
i/=
- moduł podziału
%
i%=
- bitowe ORAZ
&
- bitowe LUB
|
- bitowe NIE
~
- bitowe XOR
^
- przesunięcie bitowe w lewo
<<
- przesunięcie bitowe w prawo
>>
- logiczne NIE
!
- jednoargumentowy minus
-
- grupowanie za pomocą
(
i)
Interpreter poleceń systemu Windows nie obsługuje 64-bitowych wartości całkowitych lub wartości zmiennoprzecinkowych w wyrażeniach arytmetycznych.
Uwaga: Operator %
musi być zapisany w pliku wsadowym jako %%
aby można go interpretować jako operator.
W oknie wiersza polecenia wykonującym set /A Value=8 % 3
wiersza poleceń set /A Value=8 % 3
przypisuje wartość 2
zmiennej środowiskowej Value
i dodatkowo wyprowadza 2
.
W pliku wsadowym należy zapisać set /A Value=8 %% 3
aby przypisać wartość 2
do zmiennej środowiskowej Value
i odpowiednio nic nie jest zapisywane do obsługi STDOUT (wyjście standardowe). Zestaw linii set /A Value=8 % 3
w pliku wsadowym spowoduje komunikat o błędzie Brak operatora przy wykonywaniu pliku wsadowego.
Środowisko wymaga przełącznika /A
dla operacji arytmetycznych, a nie dla zwykłych zmiennych łańcuchowych.
Każdy ciąg w wyrażeniu arytmetycznym po set /A
jest tym, czy liczba ani operator są automatycznie interpretowane jako nazwa zmiennej środowiskowej.
Z tego powodu odwołanie się do wartości zmiennej z %variable%
lub z !variable!
nie jest konieczne, gdy nazwa zmiennej składa się tylko ze znaków słownych (0-9A-Za-z_), przy czym pierwszy znak nie jest cyfrą, co jest szczególnie pomocne w bloku poleceń rozpoczynającym się od (
i kończącym się dopasowaniem )
.
Liczby są konwertowane z łańcucha na liczbę całkowitą za pomocą funkcji C / C ++ strtol z base
równą zero, co oznacza automatyczne określanie zasady, co z łatwością może dać nieoczekiwane wyniki.
Przykład:
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%
Dane wyjściowe tego przykładu to:
11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4
Zmienne niezdefiniowane podczas oceny wyrażenia arytmetycznego są zastępowane wartością 0.
Ustawianie zmiennych z wejścia
Za pomocą przełącznika /p
z poleceniem SET
możesz definiować zmienne z wejścia.
To wejście może być wejściem użytkownika (klawiatura):
echo Enter your name :
set /p name=
echo Your name is %name%
Które można uprościć w ten sposób:
set /p name=Enter your name :
echo Your name is %name%
Lub możesz uzyskać dane wejściowe z pliku:
set /p name=< file.txt
w tym przypadku otrzymasz wartość pierwszego wiersza z file.txt
Uzyskiwanie wartości różnych linii w pliku:
(
set /p line1=
set /p line2=
set /p line3=
) < file.txt