ENDLOCAL – восстановление переменных среды в командном файле.

Disabledelayedexpansion

Setting DisabledDelayedExpansion will cause each variable to be expanded at parse time rather than at execution time,
this is the default behaviour.

Enabledelayedexpansion

Setting EnabledDelayedExpansion will cause each variable to be expanded at execution time rather than at parse time.

Errorlevel

When run from a batch file, SETLOCAL will always set an ERRORLEVEL.
If given a valid argument or no arguments, a new environment is created %ERRORLEVEL% = 0
If bad parameters given, %ERRORLEVEL% = 1

How do setlocal and enabledelayedexpansion work?

I think you should understand what delayed expansion is. The existing answers don’t explain it (sufficiently) IMHO.

Typing SET /? explains the thing reasonably well:

Delayed environment variable expansion is useful for getting around
the limitations of the current expansion which happens when a line of
text is read, not when it is executed. The following example
demonstrates the problem with immediate variable expansion:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)

would never display the message, since the %VAR% in BOTH IF statements
is substituted when the first IF statement is read, since it logically
includes the body of the IF, which is a compound statement. So the IF
inside the compound statement is really comparing “before” with
“after” which will never be equal. Similarly, the following example
will not work as expected:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%

in that it will NOT build up a list of files in the current directory,
but instead will just set the LIST variable to the last file found.
Again, this is because the %LIST% is expanded just once when the FOR
statement is read, and at that time the LIST variable is empty. So the
actual FOR loop we are executing is:

for %i in (*) do set LIST= %i

which just keeps setting LIST to the last file found.

:/>  Где на клавиатуре кнопка Win?

Delayed environment variable expansion allows you to use a different
character (the exclamation mark) to expand environment variables at
execution time. If delayed variable expansion is enabled, the above
examples could be written as follows to work as intended:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

Another example is this batch file:

@echo off
setlocal enabledelayedexpansion
set b=z1
for %%a in (x1 y1) do (
 set b=%%a
 echo !b:1=2!
)

This prints x2 and y2: every 1 gets replaced by a 2.

Without setlocal enabledelayedexpansion, exclamation marks are just that, so it will echo !b:1=2! twice.

Because normal environment variables are expanded when a (block) statement is read, expanding %b:1=2% uses the value b has before the loop: z2 (but y2 when not set).

Endlocal – восстановление переменных среды в командном файле.

   
Команда SETLOCAL используется для временного изменения значений переменных среды в командных файлах Windows. Изменения среды,
внесенные после выполнения команды SETLOCAL, являются локальными
относительно текущего пакетного файла. Для восстановления их прежних
значений необходимо выполнить команду ENDLOCAL.

Если команда ENDLOCAL отсутствует после выполнения команды SETLOCAL, то изменения переменной среды отменяются по завершению командного файла.

Иногда возникает необходимость получить значения переменных среды, сформированные на участке командного файла между SETLOCAL и ENDLOCAL. Для этого используется прием, основанный на осбенностях
командного процессора (интерпретатора) Windows. Командный процессор cmd.exe обрабатывает командные файлы построчно, преобразовывая все переменные в их значения перед выполнения команд.
Поэтому, если поместить в одну строку команды ENDLOCAL и команды SET, присваивающие внутренние значения переменных новым переменным, то с ними можно будет работать и после выполнения команды ENDLOCAL:

@Echo off

:/>  Два Windows при загрузке Компьютера! — Как убрать вторую загрузку Windows 7,8,8.1,10?

SETLOCAL

Set var1=”Test1″

Set var2=500

ENDLOCAL & SET result1=%var1% & SET result2=%var2%

Rem

ECHO Значение %result1% равно %result2%

Значения локальных переменных var1 и var2 присваиваются переменным result1 и result2, что позволяет использовать их в других секциях данного командного файла после выполнения командного файла.

При большом количестве команд SET удобнее для восприятия размещать их построчно, объединив с помощью скобок:


Endlocal&(

set var1=%item1%

set var2=%item2%

set var3=%item3%)

В данном случае, можно использовать значения переменных var1var3 в пределах всего командного файла не обращая внимания на то, что их значения формируются внутри участка между SETLOCAL и ENDLOCAL.

Команда ENDLOCAL не сбрасывает значение переменной ERRORLEVEL.

Оставьте комментарий