setlocal enabledelayedexpansion что это
SetLocal и расширенная обработка команд в Windows Batch [Статья]
SetLocal и расширенная обработка команд
По своей сути она состоит из 3 совмещенных частей:
По-умолчанию, значение переменной при инициализации
для строкового типа = пустой строке,
для числового типа = 0.
Типы переменных.
Область видимости переменной, заданной командой Set, является текущая среда интерпретатора, если батник запущен через нее (CMD.exe) (и внутри нет команды локализации SetLocal), или сессия самого батника, если двойным кликом по нему.
Позволяет обнулить переменную B, при этом в однострочной команде после EndLocal
переменная раскрываемая через % и все еще будет содержать старое значение, поэтому может быть «переброшена» через локаль.
В конструкции вида:
Что делает?
Позволяет использовать дополнительные ключи встроенных команд.
Где используется?
Откройте справку по командам, например,
For /?
Set /?
Там в первых 10 строках найдете выражение:
«Если включена расширенная обработка команд. то можно использовать еще и такие ключи. »
chdir /?
«Если включена расширенная обработка команд. в таком случае поведение команды изменяется» (касается пробелов в пути).
.
Как включается?
1) Задается командой
2) Через реестр (выше по ссылкам).
3) Через ключи CMD.exe, если бат-файл или команда запускается через него, а не напрямую.
Метод может использоваться в однострочных командах, а также методах Shell других ЯП.
Пример:
где под Commands подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.
Может быть отключена командой:
Практическая польза от отключения, как мне известно, никакой.
Если Вы измените значение переменной внутри конструкции,
раскрывая переменную через %, Вы получите ее старое значение (присвоенное до входа в эту конструкцию).
Как включить возможность использовать (!):
По-умолчанию, данный режим выключен.
Включить можно:
1) командой:
3) запуском batch-файла или команд(ы) через специальный ключ CMD.exe:
Пример:
где под Commands подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.
    Команда SETLOCAL используется для временного изменения значений переменных среды в командных файлах Windows. Изменения среды, внесенные после выполнения команды SETLOCAL, являются локальными относительно текущего пакетного файла. Для восстановления их прежних значений необходимо выполнить команду ENDLOCAL. При достижении конца пакетного файла автоматически выполняется команда ENDLOCAL для всех действующих команд SETLOCAL, выполненных в этом пакетном файле и значения всех переменных окружения восстанавливаются к состоянию до выполнения команды SETLOCAL.
Формат командной строки:
SETLOCAL | ENABLEDELAYEDEXPANSION | DISABLEDELAYEDEXPANSION
Изменение команды 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.
Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:
set LIST=
for %%i in (*) do set LIST=%LIST% %%i
echo %LIST%
Значение переменной LIST внутри цикла изменено не будет. Для того, чтобы это произошло, командный файл нужно изменить следующим образом:
Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%
Теперь, значение переменной LIST внутри цикла FOR будет изменяться, последовательно принимая значения имен файлов, разделенных пробелом ( set LIST=!LIST! %%i )
Setlocal enabledelayedexpansion что это
Начало области задания для определения переменных среды в пакетном файле. Локальное окружение используется до тех пор, пока не встретится команда endlocalили не будет достигнут конец пакетного файла.
Синтаксис
setlocal <enableextension | disableextensions>
<enabledelayedexpansion | disabledelayedexpansion>
Аргументы
Примечания
Команда setlocal не выполняется при использовании вне сценария или пакетного файла.
Используйте команду setlocal для изменения переменных среды при выполнении пакетного файла. Изменения среды, выполненные после setlocal, являются локальными для пакетного файла. Cmd.exe восстанавливает первоначальные параметры при обнаружении команды endlocal или достижении конца пакетного файла.
Команда setlocal устанавливает переменную ERRORLEVEL. При выполнении аргументов <enableextension | disableextensions> или <enabledelayedexpansion |disabledelayedexpansion> переменная ERRORLEVEL имеет значение ноль (0). В противном случае ее значение 1. Этим можно воспользоваться в пакетных программах для проверки доступности расширений командного процессора, например:
Так как команда cmd не устанавливает значение переменной ERRORLEVEL, когда расширения командного процессора отключены, команда verifyустанавливает переменную ERRORLEVEL в ненулевое значение при использовании этой команды с недопустимым аргументом. Если используется команда setlocal с аргументами <enableextension | disableextensions> или <enabledelayedexpansion | disabledelayedexpansion> и значение переменной ERRORLEVEL не 1, расширения командного процессора недоступны.
Дополнительные сведения о расширениях командного процессора смотрите в разделе cmd.
Примеры
Локальное изменение переменных среды в пакетном файле может быть использовано следующим образом:
setlocal
Starts localization of environment variables in a batch file. Localization continues until a matching endlocal command is encountered or the end of the batch file is reached.
Syntax
Parameters
Parameter | Description |
---|---|
enableextensions | Enables the command extensions until the matching endlocal command is encountered, regardless of the setting before the setlocal command was run. |
disableextensions | Disables the command extensions until the matching endlocal command is encountered, regardless of the setting before the setlocal command was run. |
enabledelayedexpansion | Enables the delayed environment variable expansion until the matching endlocal command is encountered, regardless of the setting before the setlocal command was run. |
disabledelayedexpansion | Disables the delayed environment variable expansion until the matching endlocal command is encountered, regardless of the setting before the setlocal command was run. |
/? | Displays help at the command prompt. |
Remarks
If you use setlocal outside of a script or batch file, it has no effect.
Use setlocal to change environment variables when you run a batch file. Environment changes made after you run setlocal are local to the batch file. The Cmd.exe program restores previous settings when it encounters an endlocal command or reaches the end of the batch file.
You can have more than one setlocal or endlocal command in a batch program (that is, nested commands).
The setlocal command sets the ERRORLEVEL variable. If you pass <enableextensions | disableextensions> or <enabledelayedexpansion | disabledelayedexpansion>, the ERRORLEVEL variable is set to 0 (zero). Otherwise, it’s set to 1. You can use this information in batch scripts to determine whether the extensions are available, as shown in the following example:
Because cmd does not set the ERRORLEVEL variable when command extensions are disabled, the verify command initializes the ERRORLEVEL variable to a nonzero value when you use it with an invalid argument. Also, if you use the setlocal command with arguments <enableextensions | disableextensions> or <enabledelayedexpansion | disabledelayedexpansion> and it does not set the ERRORLEVEL variable to 1, command extensions are not available.
Examples
To localize environment variables in a batch file, follow this sample script:
Setlocal
Начало области задания для определения переменных среды в пакетном файле. Локальное окружение используется до тех пор, пока не встретится команда endlocal или не будет достигнут конец пакетного файла.
Синтаксис
setlocal <enableextension | disableextensions>
<enabledelayedexpansion | disabledelayedexpansion>
Аргументы
Примечания
Команда setlocal не выполняется при использовании вне сценария или пакетного файла.
Используйте команду setlocal для изменения переменных среды при выполнении пакетного файла. Изменения среды, выполненные после setlocal, являются локальными для пакетного файла. Cmd.exe восстанавливает первоначальные параметры при обнаружении команды endlocal или достижении конца пакетного файла.
Команда setlocal устанавливает переменную ERRORLEVEL. При выполнении аргументов <enableextension | disableextensions> или <enabledelayedexpansion | disabledelayedexpansion> переменная ERRORLEVEL имеет значение ноль (0). В противном случае ее значение 1. Этим можно воспользоваться в пакетных программах для проверки доступности расширений командного процессора, например:
Так как команда cmd не устанавливает значение переменной ERRORLEVEL, когда расширения командного процессора отключены, команда verify устанавливает переменную ERRORLEVEL в ненулевое значение при использовании этой команды с недопустимым аргументом. Если используется команда setlocal с аргументами <enableextension | disableextensions> или <enabledelayedexpansion | disabledelayedexpansion> и значение переменной ERRORLEVEL не 1, расширения командного процессора недоступны.
Дополнительные сведения о расширениях командного процессора смотрите в разделе cmd.
Примеры
Локальное изменение переменных среды в пакетном файле может быть использовано следующим образом:
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).