Przejdź do głównej zawartości

setlocal

Komenda setlocal służy do rozpoczynania lokalnego kontekstu zmiennych środowiskowych w skryptach wsadowych. Pozwala tworzyć zmienne, które działają tylko w określonym zakresie (blok skryptu), a po jego zakończeniu wszystkie zmiany są automatycznie cofane. Jest przydatna w skryptach, gdzie potrzebne są tymczasowe wartości zmiennych.

Dostępna jest we wszystkich wersjach Windows (XP, Vista, 7, 8, 10, 11 oraz Windows Server).


setlocal [ENABLEEXTENSIONS] [DISABLEEXTENSIONS] [ENABLEDELAYEDEXPANSION] [DISABLEDELAYEDEXPANSION]
  • ENABLEEXTENSIONS – włącza rozszerzenia poleceń CMD w bieżącym zakresie.
  • DISABLEEXTENSIONS – wyłącza rozszerzenia poleceń.
  • ENABLEDELAYEDEXPANSION – włącza opóźnioną ekspansję zmiennych (!VAR!).
  • DISABLEDELAYEDEXPANSION – wyłącza opóźnioną ekspansję zmiennych.

ParametrOpis
ENABLEEXTENSIONSWłącza dodatkowe funkcje CMD (np. rozszerzone zmienne i polecenia).
DISABLEEXTENSIONSWyłącza rozszerzenia CMD w bieżącym zakresie.
ENABLEDELAYEDEXPANSIONPozwala na dynamiczne rozwijanie zmiennych za pomocą !zmienna! w pętli.
DISABLEDELAYEDEXPANSIONWyłącza opóźnioną ekspansję zmiennych.

Okno terminala
@echo off
set VAR=Global
echo Przed setlocal: %VAR%
setlocal ENABLEDELAYEDEXPANSION
set VAR=Lokalna
echo Wewnątrz setlocal: %VAR%
endlocal
echo Po endlocal: %VAR%
Okno terminala
# Użycie opóźnionej ekspansji w pętli
setlocal ENABLEDELAYEDEXPANSION
for /L %%i in (1,1,5) do (
set COUNT=%%i
echo Licznik: !COUNT!
)
endlocal

  • Wszystkie zmienne ustawione wewnątrz bloku setlocal znikają po wywołaniu endlocal.
  • setlocal jest automatycznie zakończone na końcu skryptu, jeśli nie użyto endlocal.
  • Funkcja przydatna w skryptach, aby uniknąć trwałych zmian zmiennych globalnych.

Błąd / KomunikatPrzyczynaRozwiązanie
Zmienna nie zachowuje wartości po skrypciesetlocal ogranicza zakres zmiennych do lokalnego bloku.Użyj zmiennych poza setlocal lub przypisz ich wartości przed endlocal.
Nie działa opóźniona ekspansja zmiennychBrak ENABLEDELAYEDEXPANSION.Dodaj setlocal ENABLEDELAYEDEXPANSION na początku skryptu.