Как я уже говорил в вашем другом вопросе: Пакет: возвращение значения из SETLOCAL EnableDelayedExpansion
Просто перейдите по ссылке для «идеального» решения
Или я могу вставить код здесь
rem ** Preparing CR and LF for later use
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"
set LF=^
rem TWO Empty lines are neccessary
Затем в начале вашей функции, чтобы определить, установлено ли delayedExpansion в положение OFF или ON
setlocal
set "NotDelayedFlag=!"
setlocal EnableDelayedExpansion
И в конце вашей функции вернуть значение
rem ** Prepare for return
set "var=!var:%%=%%~2!"
set "var=!var:"=%%~3!"
for %%a in ("!LF!") do set "var=!var:%%~a=%%~L!"
for %%a in ("!CR!") do set "var=!var:%%~a=%%~4!"
rem ** It is neccessary to use two IF's, else the %var% expansion doesn't work as expected
if not defined NotDelayedFlag set "var=!var:^=^^^^!"
if not defined NotDelayedFlag set "var=%var:!=^^^!%" !
set "replace=%% """ !CR!!CR!"
for %%L in ("!LF!") do (
for /F "tokens=1,2,3" %%2 in ("!replace!") DO (
ENDLOCAL
ENDLOCAL
set "%~1=%var%" !
@echo off
goto :eof
)
)
РЕДАКТИРОВАТЬ: немного более короткое изменение
Хорошо, это выглядит немного сложнее, и во многих случаях это можно решить с помощью другого трюка.
Если вы знаете, что вы переключитесь обратно с EnableDelayed на DisableDelayed, и вы уверены, что не используете какой-либо LF, FOR-RETURN будет работать тоже.
@echo off
setlocal
call :myTest result
set result
goto :eof
:myTest
setlocal EnableDelayedExpansion
rem ... do something here
set "value=^!_&_%%_|_>"
echo --
for /f ^"eol^=^
^ delims^=^" %%a in ("!value!") do (
endlocal
set "%~1=%%a"
goto :eof
)
Разделение for /f ^"eol^=^....
предназначено только для отключения символа eol.