Проблема в том, что вы пытались изменить doNotLog
и choice
внутри setlocal
, поэтому вы установили их локально, но глобальные значения остаются неизменными.
Получите их значение внутри setlocal
, чтобы получить ожидаемый результат:
@echo off
echo enter choice
set/p choice=
set doNotLog=false
setlocal ENABLEDELAYEDEXPANSION
if %choice:~-1,1%==n (
set doNotLog=true
set choice=!choice:n=!
)
echo After changes:
echo choice= %choice%
echo donotLog= %doNotLog%
@pause
endlocal
В качестве альтернативы, вы можете перемещать переменные из локального значения, используя маги c из одной строки или сгруппированные в скобках команды и синтаксис classi c %variable%
:
endlocal & set "doNotLog=%doNotLog%" & set "choice=%choice%"
... или эквивалентный, но более читаемый ...
(
endlocal
set "doNotLog=%doNotLog%"
set "choice=%choice%"
)
Выше решения могут выглядеть глупо, но они работают ...
Оба из вышеперечисленных будут устанавливать глобальные переменные, потому что они после endlocal
, но читают локальные, так как они подставляются перед вычислением линия (или сгруппированная структура) начинается. (Вот почему эти хаки работают с синтаксисом %var%
, но не с !var!
)
Итак, ваш код может быть изменен на:
@echo off
echo enter choice
set/p choice=
set doNotLog=false
setlocal ENABLEDELAYEDEXPANSION
if %choice:~-1,1%==n (
set doNotLog=true
set choice=!choice:n=!
)
(
endlocal
set "doNotLog=%doNotLog%"
set "choice=%choice%"
)
echo After changes:
echo choice= %choice%
echo donotLog= %doNotLog%
@pause