Статья – CMD: SetLocal и расширенная обработка команд | SafeZone – форум помощи

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.

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.

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%

:/>  Освоение сценариев microsoft 365 power shell

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).

Visual-studio – cgal – сборка install .sln, ошибка msb3073: команда «setlocal» –

У меня проблема при компиляции CGAL. ​​Я выполнил следующие шаги: http: // www. cse.msu.edu/~ytong/CGAL_installation.ppt Я использую VS2022, cgal 4.9.1, BOOST 1.59.0, Qt5.7.1

Но когда я добираюсь до этапа INSTALL .sln, он показывает следующую ошибку:

Error 1 error MSB3073: The command "setlocal
"C:Program FilesCMakebincmake.exe" -DBUILD_TYPE=Debug -P cmake_install.cmake
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
:VCEnd" exited with code 1. C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets 132 5 INSTALL

Выходное сообщение:

 1>------ Rebuild All started: Project: INSTALL, Configuration: Debug Win32 ------
1> -- Install configuration: "Debug"
1> -- Up-to-date: C:/Program Files (x86)/CGAL/share/doc/CGAL-4.9.1/AUTHORS
1> -- Up-to-date: C:/Program Files (x86)/CGAL/share/doc/CGAL-4.9.1/CHANGES
1> CMake Error at cmake_install.cmake:39 (file):
1> file INSTALL cannot set permissions on "C:/Program Files
1> (x86)/CGAL/share/doc/CGAL-4.9.1/CHANGES"
1>
1>
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: The command "setlocal
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: "C:Program FilesCMakebincmake.exe" -DBUILD_TYPE=Debug -P cmake_install.cmake
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: if %errorlevel% neq 0 goto :cmEnd
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: :cmEnd
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: :cmErrorLevel
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: exit /b %1
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: :cmDone
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: if %errorlevel% neq 0 goto :VCEnd
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppCommon.targets(132,5): error MSB3073: :VCEnd" exited with code 1.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

Любая помощь, пожалуйста?

Статья – cmd: setlocal и расширенная обработка команд

Статья от 10.05.2022
Автор: Dragokas

SetLocal, расширенная обработка команд и отложенное раскрытие значения переменной

Часто встречали такую конструкцию ?

По своей сути она состоит из 3 совмещенных частей:

SetLocal

Что делает?
SetLocal – означает, что все переменные, объявленные внутри Batch-файла, будут локальными и после выхода из него обнуляться.
Это также оберегает от случаев, когда Вы забываете задавать начальное значение переменной.

По-умолчанию, значение переменной при инициализации
для строкового типа = пустой строке,
для числового типа = 0.

Если Вы запускаете Batch-файл
– из CMD.exe (ПУСК -> Выполнить -> CMD -> {Enter})
– один Batch-файл из другого
то при повторном запуске без команды SetLocal в переменных останутся старые значения.

Область видимости переменной, заданной командой Set, является текущая среда интерпретатора, если батник запущен через нее (CMD.exe) (и внутри нет команды локализации SetLocal), или сессия самого батника, если двойным кликом по нему.

Smitis написал(а):


Как задается?

Переменные, использованные после команды SetLocal, можно обнулить принудительно еще до выхода из Batch-файла командой:

:/>  Nm b242 boardview et 320-15IKB (тип 80XL, 80YE) (ideapad) EG521 EG522 EZ511 EG721 NM-B452 REV 1.0

Extensions

– режим расширенной обработки команд.

Что делает?
Позволяет использовать дополнительные ключи встроенных команд.

Где используется?
Откройте справку по командам, например,
For /?
Set /?
Там в первых 10 строках найдете выражение:
“Если включена расширенная обработка команд… то можно использовать еще и такие ключи…”
chdir /?
“Если включена расширенная обработка команд… в таком случае поведение команды изменяется” (касается пробелов в пути).

Как включается?
1) Задается командой

EnableExtensions – обычно включена в системе по-умолчанию.

Но может быть выключена принудительно через реестр, а также по-умолчанию, выключена в некоторых старых ОС.

EnableExtensions

Поэтому, ее желательно включать во все скрипты.

2) Через реестр (выше по ссылкам).
3) Через ключи CMD.exe, если бат-файл или команда запускается через него, а не напрямую.

Метод может использоваться в однострочных командах, а также методах Shell других ЯП.
Пример:

где под

Commands

подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по

правилам формирования однострочных команд Batch

.

Может быть отключена командой:

Практическая польза от отключения, как мне известно, никакой.

DelayedExpansion – режим отложенного расширения переменных среды.

Что делает?
EnableDelayedExpansion – означает возможность использовать восклицательные знаки (!variable!) для раскрытия значения переменной.

Elroir написал(а):

Обычно переменные раскрываются через знак %.

“Раскрывается” – означает, что мы получаем значение, которое хранит переменная.

Пример:

Необходимость использовать знаки (!) возникает:

  • внутри цикла
  • под скобками
  • в однострочной команде

*Здесь и далее под

конструкцией

подразумевается один из указанных выше вариантов.

Если Вы измените значение переменной внутри конструкции,

раскрывая переменную через %, Вы получите ее старое значение (присвоенное до входа в эту конструкцию).

Новое (актуальное) значение переменной можно получить:

Как включить возможность использовать (!):

По-умолчанию, данный режим выключен.

Включить можно:
1) командой:

2) через реестр (на постоянной основе – пользоваться пп.1,3 будет не нужно, но будет работать только на Вашей машине.)

DelayedExpansion

3) запуском batch-файла или команд(ы) через специальный ключ CMD.exe:

Пример:

где под

Commands

подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.

Ремарка:

Принцип раскрытия переменных влияет также на изменяемые глобальные переменные, например,

time

и

date

, которые постоянно обновляются и отображают дату и время.

После входа в конструкцию эти переменные “замораживаются”.
Чтобы получить актуальную дату/время необходимо раскрытие через знаки (!):

§

Статья от 10.05.2022
Автор: Dragokas

SetLocal, расширенная обработка команд и отложенное раскрытие значения переменной

Часто встречали такую конструкцию ?

По своей сути она состоит из 3 совмещенных частей:

SetLocal

Что делает?
SetLocal – означает, что все переменные, объявленные внутри Batch-файла, будут локальными и после выхода из него обнуляться.
Это также оберегает от случаев, когда Вы забываете задавать начальное значение переменной.

По-умолчанию, значение переменной при инициализации
для строкового типа = пустой строке,
для числового типа = 0.

Если Вы запускаете Batch-файл
– из CMD.exe (ПУСК -> Выполнить -> CMD -> {Enter})
– один Batch-файл из другого
то при повторном запуске без команды SetLocal в переменных останутся старые значения.

:/>  Лучшие бесплатные редакторы реестра

Область видимости переменной, заданной командой Set, является текущая среда интерпретатора, если батник запущен через нее (CMD.exe) (и внутри нет команды локализации SetLocal), или сессия самого батника, если двойным кликом по нему.

Smitis написал(а):


Как задается?

Переменные, использованные после команды SetLocal, можно обнулить принудительно еще до выхода из Batch-файла командой:

Extensions

– режим расширенной обработки команд.

Что делает?
Позволяет использовать дополнительные ключи встроенных команд.

Где используется?
Откройте справку по командам, например,
For /?
Set /?
Там в первых 10 строках найдете выражение:
“Если включена расширенная обработка команд… то можно использовать еще и такие ключи…”
chdir /?
“Если включена расширенная обработка команд… в таком случае поведение команды изменяется” (касается пробелов в пути).

Как включается?
1) Задается командой

EnableExtensions – обычно включена в системе по-умолчанию.

Но может быть выключена принудительно через реестр, а также по-умолчанию, выключена в некоторых старых ОС.

EnableExtensions

Поэтому, ее желательно включать во все скрипты.

2) Через реестр (выше по ссылкам).
3) Через ключи CMD.exe, если бат-файл или команда запускается через него, а не напрямую.

Метод может использоваться в однострочных командах, а также методах Shell других ЯП.
Пример:

где под

Commands

подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по

правилам формирования однострочных команд Batch

.

Может быть отключена командой:

Практическая польза от отключения, как мне известно, никакой.

DelayedExpansion – режим отложенного расширения переменных среды.

Что делает?
EnableDelayedExpansion – означает возможность использовать восклицательные знаки (!variable!) для раскрытия значения переменной.

Elroir написал(а):

Обычно переменные раскрываются через знак %.

“Раскрывается” – означает, что мы получаем значение, которое хранит переменная.

Пример:

Необходимость использовать знаки (!) возникает:

  • внутри цикла
  • под скобками
  • в однострочной команде

*Здесь и далее под

конструкцией

подразумевается один из указанных выше вариантов.

Если Вы измените значение переменной внутри конструкции,

раскрывая переменную через %, Вы получите ее старое значение (присвоенное до входа в эту конструкцию).

Новое (актуальное) значение переменной можно получить:

Как включить возможность использовать (!):

По-умолчанию, данный режим выключен.

Включить можно:
1) командой:

2) через реестр (на постоянной основе – пользоваться пп.1,3 будет не нужно, но будет работать только на Вашей машине.)

DelayedExpansion

3) запуском batch-файла или команд(ы) через специальный ключ CMD.exe:

Пример:

где под

Commands

подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.

Ремарка:

Принцип раскрытия переменных влияет также на изменяемые глобальные переменные, например,

time

и

date

, которые постоянно обновляются и отображают дату и время.

После входа в конструкцию эти переменные “замораживаются”.
Чтобы получить актуальную дату/время необходимо раскрытие через знаки (!):