У меня есть пакетный файл с некоторыми функциями. Каждая функция использует setlocal
так, чтобы ее переменные не загрязняли основной пакетный скрипт. Я заметил, что мне нужен только аргумент ENABLEDELAYEDEXPANSION
в основном скрипте партии, а не в каждом вложенном setlocal. Например:Пакетный файл вложенной setlocal - установка необязательных аргументов только один раз
@echo off
setlocal ENABLEDELAYEDEXPANSION
set VAR=hi
CALL :function
echo bye
exit /b 0
:function
setlocal
echo !VAR!
exit /b 0
Это разрешено в пакетном файле, поскольку я не могу найти его документированным, за исключением случаев, указанных ниже. Это намного проще, чем писать только setlocal
для каждой функции, а не указывать дополнительные аргументы.
setlocal /?
говорит это о ENABLEDELAYEDEXPANSION:
Эти модификации последнего до команды соответствия Endlocal, независимо от их установки до SETLOCAL команды.
Возможно, это будет означать, что даже с другим setlocal настройки остаются неизменными?
Спасибо за вашу помощь и слова предостережения! – loop
Есть ли у вас ссылка на то, как замедленное расширение может вызвать проблемы?Я читаю [здесь] (http://stackoverflow.com/a/7896431/894506), он безопасен для специальных символов. – loop
@test - Да, но прочитайте 4-й абзац с конца, а затем попробуйте это в пакетном файле: 'setlocal enableDelayedExpansion & for/f 'delims =" %% A in («Привет, мир! Приятно вас видеть!») do echo %% A'. Он будет печатать только «Hello world». Измените сценарий, чтобы отключить задержанное расширение, и вся фраза с восклицательными знаками будет сохранена. – dbenham