Учитывая ваш пример кода, я думаю, что вы спрашивают: «Как установить динамическое число переменных после endlocal?» То, что вы просите, не очень интуитивно, но это возможно. Вы не можете использовать задержанное расширение при составлении set
с endlocal
. Обходной путь часто можно использовать для использования цикла for
для endlocal & set "var=%%A"
, который работает только в том случае, если количество переменных и значений является статическим. К сожалению, endlocal & for
не работает так же, как for... in... do (endlocal & set)
, как вы, несомненно, обнаружили в своем собственном тестировании.
Мое решение использовать макрос, чтобы сделать установку после endlocal
- в основном ввод команды, а не простые строковые значения в переменную, а затем оценить эту переменную как набор set
команд.
@echo off
setlocal
:: // call ":set" subroutine to do the setting
call :set
:: // display results
set subv
:: // end main runtime
goto :EOF
:: // :set subroutine
:set
setlocal enabledelayedexpansion
:: // any number of variables prefixed by "subv"
set "subv1=1"
set "subv2=2"
set "subv3=3"
:: // init %compound%
set compound=
:: // combine all %subvX% variables into a macro of set var1=val1 & set var2=val2, etc
for /f "delims=" %%I in ('set subv') do set "compound=!compound! & set "%%~I""
:: // evaluate set commands as a macro
endlocal & %compound:~3%
goto :EOF
Другие решения, чтобы вернуться к первому обходного я уже говорил, в формате endlocal & set "var=%%A"
. Как правило, используется только тогда, когда вы знаете, вы будете только петля один раз, что-то вроде
for %%I in ("!var!") do endlocal & set "return=%%~I"
... потому что вы не хотите Endlocal слишком много раз. Но вы можете сделать несколько цикла значение с одним endlocal
, используя if not defined
так:
@echo off
setlocal
call :set
set subv
goto :EOF
:set
setlocal enabledelayedexpansion
set "subv1=1"
set "subv2=2"
set "subv3=3"
set end=
for /f "delims=" %%I in ('set subv') do (
if not defined end endlocal & set end=1
set "%%~I"
)
goto :EOF
... и потому, что endlocal
и set "%%~I"
содержатся в вводном блоке кода, переменные повторно установить и ваша цель Достигнут.
Я пробовал оба, но ни одно из этих решений не работало – Rado