BAT batch file setlocal, endlocal command detailed – Programmer Sought

Help по коммандам ms dos

setlocal

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

SETLOCAL

Изменение команды SETLOCAL при включении расширенной обработки команд:

Команда SETLOCAL принимает необязательные аргументы: ENABLEEXTENSIONS или
DISABLEEXTENSIONS. Это позволяет включить или отключить расширенную обработку
команд до выполнения команды. См. CMD /? для подробного объяснения.
ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION включает или отключает
отложенное расширение переменной среды.  См. SET /? для подробного объяснения.
Эти изменения действуют до совпадения команды ENDLOCAL, независимо от исходного
состояния до вызова команды SETLOCAL.

Если команда SETLOCAL вызывается с аргументом, она устанавливает код ошибки
ERRORLEVEL.  Если указан один из двух допустимых аргументов, код ошибки будет
равен нулю, иначе возвращается значение 1.  Это свойство можно использовать в
пакетных файлах, чтобы определить доступность расширенной обработки команд,
например:

    VERIFY OTHER 2>nul
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo Не удается включить расширенную обработку

Эта группа команд работает, так как в прежних версиях CMD.EXE команда SETLOCAL
не устанавливает значение ERRORLEVEL. Команда VERIFY с недопустимым аргументом
необходима для установки ненулевого значения ERRORLEVEL.

Как работают setlocal и enabledelayedexpansion? – 4 ответа

Думаю, вы должны понимать, что такое отложенное расширение is. Существующие ответы не объясняют это (в достаточной степени) ИМХО.

Ввод SET /? достаточно хорошо объясняет:

Отложенное расширение переменной среды полезно для обхода ограничений текущего раскрытия, которое происходит при чтении строки текста, а не при ее выполнении. Следующий пример демонстрирует проблему с немедленным расширением переменной:

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

никогда не отобразит сообщение, поскольку% VAR% в ОБЕИХ операторах IF заменяется при чтении первого оператора IF, поскольку он логически включает тело IF, которое является составным оператором. Таким образом, IF внутри составного оператора действительно сравнивает «до» с «после», которые никогда не будут равны. Точно так же следующий пример не будет работать должным образом:

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

в этом случае он НЕ будет создавать список файлов в текущем каталоге, а вместо этого просто установит переменную LIST на последний найденный файл. Опять же, это связано с тем, что% LIST% раскрывается только один раз при чтении оператора FOR, и в это время переменная LIST пуста. Итак, фактический цикл FOR, который мы выполняем, таков:

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

который просто устанавливает LIST на последний найденный файл.

Отложенное раскрытие переменных среды позволяет использовать другой символ (восклицательный знак) для раскрытия переменных среды во время выполнения. Если включено отложенное раскрытие переменных, приведенные выше примеры могут быть записаны следующим образом, чтобы работать по назначению:

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%

:/>  Программы для переноса и клонирования системы на SSD-диск

Другой пример – командный файл:

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

Это печатает x2 и y2: каждая единица заменяется на 1.

Без setlocal enabledelayedexpansion, восклицательные знаки – это просто так, поэтому он будет эхом !b:1=2! дважды.

Поскольку обычные переменные среды раскрываются, когда оператор (блок) читать, Расширение %b:1=2% использует значение b перед циклом: z2 (но y2 когда не установлен).

Особенности

  • Разрешается в одной программе неоднократно применять endlocal и setlocal.
  • Имеется специальная переменная, которая имеет название ERRORLEVEL. Она используется в ходе выполнения setlocal. Если все в норме, значение будет составлять 0, а при ошибке -1. 

Расшифровка

enableextension

Позволяет использовать расширения командного процессора (КП). Они будут применяться до того периода, пока не возникнет endlocal. Отличительной особенностью является тот факт, что состояние расширений КП не оказывает влияния на процесс.

disableextensions


Завершает применение расширения КП до тех пор, пока не возникнет endlocal. Как и в предыдущем случае, состояния расширений КП перед setlocal не играют роли.

enabledelayedexpansion

Обеспечивает начало работы расширений переменной среды (ПС). Предусматривается задержка, пока не возникнет команда endlocal.

disabledelayedexpansion


Расширения ПС будут выключены. Имеется определенная задержка до возникновения endlocal. Это происходит без какого-либо воздействия или влияния со стороны состояния КП перед setlocal.

Используется в тех ситуациях, когда поставлена задача отобразить справочные сведения.

Синтаксис

setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}

Bat batch file setlocal, endlocal command detailed – programmer sought

The result of the setlocal and endlocal commands is to let the intermediate program change the system variables only within the program, without affecting the entire system level.

E.g

@echo off
setlocal
path=d:
Echo local environment variable path value
set path
endlocal
 Echo system environment variable path value
set path

In the above example, after the second line setlocal, the third line is assigned to the variable path, and the fourth line is to display the value. After the sixth line endlocal, redisplay the system variable path (the seventh line), you will find that the path value before the program is running, not changed by the program.

setlocal enabledelayedexpansion

The delay variable is called “delayed environment variable extension”. To understand this, we must first understand what is called extension!

When CMD interprets our commands, it first reads a complete command line and then performs some command format matching to see if the format of the command you entered meets his requirements. If we want to be at us The command refers to some variables, then how do we let CMD recognize this variable when interpreting our commands? At this point we can add a % sign to the variable name, such as %name%. When CMD is reading When we take our entire line of commands for format matching, we will find that the name of the character has a % sign on both sides, so it will not be treated as a normal character, but will be treated as a variable. The variable name is called name. Then CMD will find the value corresponding to the variable name, replace the variable name (name) with the value of the variable name, (if the variable name does not exist, it will return a null value). Then replace this and match the command execution The process of replacing the value is called variable expansion. To put it bluntly, the name of the variable is replaced by its value! This is the process of how the batch recognizes a variable. (Note: here is only the extension of the variable. Meaning, not delaying the expansion of environment variables, to understand the extension of the environment variable, you must first understand what is the extension of the variable) that is how the batch process recognizes a variable._
For example, this one BAT

set var=test
echo %var%

After CMD reads the command echo %var%, it will perform the matching operation. It immediately finds that there are % numbers on both sides of the var character. Then he will treat it as a variable. Check the name of the var variable. Is not a value, if there is to replace the variable name var with his value, here our VAR in the previous command set var=test, assign var value to test, so he will use test to change the variable %var% The name is replaced, and the result of the replacement is the echo test. These steps are the steps of the CMD matching operation. After the matching, he executes the echo test statement. At this time, our CMD will echo a test. What is the environment variable extension knows, what is the delay environment variable extension? When understanding the environment variable extension, we know that when CMD interprets the command, it will first read a complete command and then perform the matching operation. When matching, he will replace the variable in the command with the value of the variable, and then execute the replacement command.
The problem lies in “a complete command”. In BAT, commands such as IF FOR can be bracketed and some commands are nested inside.
For a command that can be expanded with other commands, the full format is for %%i in (…). At this point, if we are in parentheses Embedding some commands that set the value of a variable will cause problems!
See example

@echo off
for /l %%i in (1,1,5) do (
    set var=%%i
    echo %var%
)

It stands to reason that the implementation result should be

:/>  Автозагрузка программ в Windows 7

1
2
3
4
5

But after execution, it shows 5 blank lines of error! Why? Understand the knowledge we have above

@echo off
set var=test
for /l %%i in (1,1,5) do (
    set var=%%i
    echo %var%
)

This will print 5 tests, indicating that for /l %%i in (1,1,5) does not work.

Through these two examples, everyone should understand that if only the environment variable extends the process, if we perform the assignment operation in the command that can nest the command, it will cause our BAT to assign a value to the variable. Then this When the “delay environment variable extension” is introduced, this concept is proposed. In batch processing, we can use the setloacl ENABLEDELAYEDEXPANSION command to enable “delay environment variable expansion”. After we enable “delay environment variable extension”, when CMD is in When interpreting a command with a nested format, it will execute the nested command one by one, and then perform the matching operation, so that our assignment will be completed. After the “delay environment variable extension” is enabled, CMD will use the ! sign to judge whether this is a variable. If it is not enabled, the variable is judged in the format of %name%. After it is enabled, it is judged by the format of !name!, we need to pay attention to this symbol!
example:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set var=test
for /l %%i in (1,1,5) do (
    set var=%%i
    echo !var!
)

The result of the execution should be

1
2
3
4
5

So everyone should understand what is the extension of the environment variable extension.
Another example

@echo off
set var=test & echo %test%
pause

This command is placed on one line, indicating that he is a complete command. If the “Delay Environment Variable Extension” is not enabled, the above assignment error will occur!
changed to this

@echo off
setlocal ENABLEDELAYEDEXPANSION
set var=test & echo !var!
pause

It’s easy to understand!

:/>  Сколько места занимает Windows 10

Transfer from:

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

Adblock
detector