Команда Setlocal
Обеспечивает начало области задания для установки некоторых значений в заданном пакетном документе. Предусматривается использование локального окружения до момента, когда используется endlocal или не настанет завершение пакетного документа. Если запускать Setlocal за пределами сценария или пакетного документа, то она не станет работать.
Синтаксис
Расшифровка
enableextension
Позволяет использовать расширения командного процессора (КП). Они будут применяться до того периода, пока не возникнет endlocal. Отличительной особенностью является тот факт, что состояние расширений КП не оказывает влияния на процесс.
disableextensions
Завершает применение расширения КП до тех пор, пока не возникнет endlocal. Как и в предыдущем случае, состояния расширений КП перед setlocal не играют роли.
enabledelayedexpansion
Обеспечивает начало работы расширений переменной среды (ПС). Предусматривается задержка, пока не возникнет команда endlocal.
disabledelayedexpansion
Расширения ПС будут выключены. Имеется определенная задержка до возникновения endlocal. Это происходит без какого-либо воздействия или влияния со стороны состояния КП перед setlocal.
Используется в тех ситуациях, когда поставлена задача отобразить справочные сведения.
SETLOCAL – Windows CMD Command
Set options to control the visibility of environment variables in a batch file.
SETLOCAL on it’s own, usually at the start of a batch file, will begin localisation of Environment Variables.
Issuing a SETLOCAL command, the batch script will inherit all current variables from the master environment/session.
Issuing an ENDLOCAL command will restore any environment variables present before the SETLOCAL was issued.
If a batch script does not use SETLOCAL then all variables will be Global, i.e. visible and modifiable by other scripts.
Although global variables are easy to work with they are not good practice – for example if you have several batch scripts dealing with filenames (and these scripts are CALLing one another), the first script has a variable called _filename, the second script a different variable called file-name (a different name to avoid conflicting with the first script) a third script now needs something like file_name this quickly becomes very difficult to manage.
With local variables you are free to use the same variable names in multiple batch scripts – there is no conflict because the local variables are not visible to any other script.
Local Variables can be passed from one batch routine to another with the ENDLOCAL command.
EnableDelayedExpansion
Setting EnabledDelayedExpansion will cause each variable to be expanded at execution time rather than at parse time.
DisableDelayedExpansion
Setting DisabledDelayedExpansion will cause each variable to be expanded at parse time rather than at execution time, this is the default behaviour.
Overloading a variable:
SETLOCAL can be used more than once in the same batch file so that multiple values can be stored in the same Environment Variable. To keep track of variable definitions, pair each SETLOCAL with a corresponding ENDLOCAL.
SETLOCAL is limited to 32 active instantiations per CALL level. At the root level a script can have up to 32 active SETLOCAL, and then CALL a subroutine that gets its own allocation of up to 32 SETLOCAL, etc.
@Echo off
SETLOCAL
::Standard commission
Set _Commission=20
Echo Standard commission %_Commission%
::Premium commission
SETLOCAL
Set _Commission=30
Echo Premium commission %_Commission%
::back to Standard commission
ENDLOCAL
Echo %_Commission%
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
EnableExtensions / DisableExtensions
Command Extensions are enabled by default, there is rarely any need to disable them.
If Command Extensions are permanently disabled or if a script is running under the Windows 95 command processor command.com then SETLOCAL ENABLEEXTENSIONS will not be able to restore them.
A batch file to warn if command extensions are not available (see forum thread):
SETLOCAL and ENDLOCAL
The syntax given below is for Windows NT 4.
In OS/2 (CMD.EXE) SETLOCAL and ENDLOCAL follow the same basic syntax, without the extensions of NT’s Command Extensions.
| Note: | The parts of this text that are displayed in magenta are valid for Windows 2000 and later versions only |
|---|
SETLOCAL
Begins localization of environment changes in a batch file.
Environment changes made after SETLOCAL has been issued are local to the batch file.
ENDLOCAL must be issued to restore the previous settings.
In Windows NT 4 and later versions, if Command Extensions are enabled, SETLOCAL changes as follows:
SETLOCAL batch command now accepts an optional argument, which can be either ENABLEEXTENSIONS or DISABLEEXTENSIONS .
This will enable or disable the Command process extensions until the matching ENDLOCAL command, regardless of their setting prior to the SETLOCAL command.
In Windows 2000, an additional pair of switches is available:
The SETLOCAL command will set the ERRORLEVEL value if given an argument.
It will be zero if one of the two valid arguments is given and one otherwise.
You can use this in batch scripts to determine if the extensions are available, using the following technique:
This works because on old versions of CMD.EXE, SETLOCAL does not set the ERRORLEVEL value.
The VERIFY command with a bad argument initializes the ERRORLEVEL value to a non-zero value.
ENDLOCAL
Ends localization of environment changes in a batch file.
Environment changes made after ENDLOCAL has been issued are not local to the batch file; the previous settings are not restored on termination of the batch file.
In Windows NT 4 and 2000, if Command Extensions are enabled, ENDLOCAL changes as follows:
If the corresponding SETLOCAL enabled or disabled command extensions using the new ENABLEEXTENSIONS or DISABLEEXTENSIONS options, then after the ENDLOCAL, the enabled/disabled state of command extensions will be restored to what it was prior to the matching SETLOCAL command execution.
Bypass SETLOCAL/ENDLOCAL
Sometimes it would be nice if we could use SETLOCAL and ENDLOCAL to preserve the initial environment but still change one variable «permanently», in the SORTDATE and SORTTIME examples, for example.
I recently saw a posting at the alt.msdos.batch.nt newsgroup where Phil Robyn solved this problem in an ingenious way:
This way the environment variable TEST and its value are preserved in spite of the ENDLOCAL command.
See my Conditional Execution page for an explanation of the ampersand’s usage.
page last modified: 2021-01-27
Command extensions enable extra features in NT shells.
By default command extensions are enabled. However, to be absolutely sure that they are, either use SETLOCAL ENABLEEXTENSIONS within your NT shell scripts (batch files) or execute those scripts using CMD /X .
Likewise, you may disable command extensions using SETLOCAL DISABLEEXTENSIONS or CMD /Y .
Консоль в Windows или немного о BAT и командной строке
Кому посчастливилось родиться в 80-ых годах (или раньше) и сравнительно рано заиметь компьютер, прекрасно знают про DOS. Пусть в нём и были удобные файл-менеджеры, вроде Norton Commander, или горячо мною любимый DOS Navigator (пиратский, конечно), консолью пользоваться приходилось. Кто не знает, это такой чёрный экран с текстом. Всё управление осуществлялось посредством ввода специальных команд. Сейчас в Windows для всего существуют привычные окошки. Но командную строку выпиливать не стали.
Любители Линукса с консолью тоже знакомы. Остальные могут задаться вопросом: нафига она нужна? Так и есть, не нужна, если возникают подобные вопросы. Пост для тех, кто хочет. Рассмотрим несколько примочек стандартного cmd.exe , вызываемого при запуске bat-файла.
Кто-то может сказать, что bat-файлы не нужны, если есть консоль. Всё так, но «батнички» создаются для удобства. Допустим, есть группа картинок в какой-то папке, которые надо прогнать через оптимизатор. Если картинки постоянно новые, например, перед публикацией очередной статьи на блоге, удобнее подготовиться один раз, после чего скинуть файлы в папку, запустить bat-файл и загружать готовые картинки.
Рассмотрим группу полезных и не очень команд, которые могут использоваться при работе.
Команда pause
Просто выводит сообщение о необходимости нажать любую клавишу для продолжения и ожидает нажатие клавиши. Команда очень полезна, когда требуется что-то выполнить и не закрывать консоль после этого. Иначе говоря, можно видеть результат работы команд.
Команда @echo off
Многие батники начинаются с этой строки. Проиллюстрировать, что делает программа, проще всего на таком батнике:

Если первой строки нет, будет тот вариант, что слева. При наличии этой строки — вариант справа. Получается, @echo off препятствует выводу исполняемой команды. Результаты работы в консоли отображаются.
Команда cls
Всё, что делается — очищается консоль.
Разделитель команд
Для выполнения сразу нескольких команд можно использовать & — символ амперсанда.
Меняет цвет шрифта на зелёный, очищает экран и выводит надпись о необходимости нажатия клавиши для продолжения работы.
Переключить диск на другой
Просто пишем букву диска и ставим двоеточие:
Текущий диск меняется на D .
Вывод текущего каталога, смена каталога
Команда cd без параметров выводит полный путь к тому месту, где мы находимся. Для смены нужно добавить параметр с путём:
Меняет путь на системную директорию Windows . Важно! Команда работает только в путями диска, на котором находимся в данный момент. Если нужно использовать файл с другого диска, для начала переключитесь на него (см. предыдущую команду).
Вывод в файл
Есть и такая возможность. Используйте символ > с указанием имени файла, в который надо скопировать результат работы команды.
В файл 1.txt будет записан листинг (вывод) команды dir , которая выводит список всех папок и файлов в текущем каталоге.
Установка переменных
Для этого нужно использовать команду set , а в качестве параметра указать имя переменной и сразу, без пробелов, знак равно и значение. Для доступа к установленной переменной в программе используется её имя, обрамлённое знаками процента. Пример:
Как назначить переменной текущий путь
Путь к текущему каталогу содержится в особой переменной %
SetLocal и параметры
В начало bat-файла обычно добавляются параметры для изменения значения переменных среды выполнения.
- EnableExtensions — включение расширенной обработки команд. В частности, нужно для обработки флага /r.
- EnableDelayedExpansion — для корректного изменения переменных. Установленные переменные далее, в циклах, не меняются. Этот флаг позволяет изменить поведение, но для доступа к переменным нужно использовать не знаки процента %var%, а восклицательные знаки !var!.
Получение определённых файлов из каталога и его подкаталогов
Выше упоминалась команда dir , которая выводила содержимое текущего каталога. Она может принимать в качестве пути маску для поиска, но действует, опять же, только в целевой директории. Для рекурсивного поиска существует команда for с флагом /R.
Команда ищет не только в указанном месте (в данном случае — символ точки — текущая директория), а так же во всех вложенных поддиректориях, файлы с расширением *.png, после чего выводит их на экран. Обратите внимание на синтаксис, знаки процента указывают перед переменной.
Замена части строки на другую
Очень интересный синтаксис. В момент использования переменной, нужно сразу после её имени поставить двоеточие, указать ЧтоМеняем, знак равно и НаЧтоМеняем. Чтобы было ясно, пусть определена переменная a. Тогда, для замены юзается такая конструкция %a:ЧтоМеняем=НаЧтоМеняем%. Пример:
Выведет на экран надпись Aloha, world.
Вывод путей файлов относительно текущего каталога
Для этого потребуются фишки, используемые выше.
Вторая строка здесь обязательна. Без установки флага EnableDelayedExpansion переменная fn не раскроется. При отсутствии EnableExtensions работать будет, но это не точно — некоторые пользователи могут переопределить соответствующую настройку в реестре, и программа будет ругаться на флаг /R. Поэтому просто указываем оба параметра, на случай юзеров с непредвиденным поведением рук.
Пожалуй, на сегодня достаточно. Для более детальной справки по указанным программа пользуйте стандартный параметр /? например так:
В следующий раз, основываясь на полученном сегодня опыте, сделаем какую-нибудь годноту. Если нашли для себя что-то полезное, не поленитесь жмакнуть кнопочку ниже ↓ и рассказать друзьям. Может, они тоже найдут для себя что-то.
Свежим хлебушком типа батон —>
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости продлением домена —>
продлением хостинга на +1 месяц