Пакет: Возврат значения из SETLOCAL EnableDelayedExpansion

Интересно, почему этот код не работает должным образом:

@ECHO off
SET S1=HELLO

SETLOCAL EnableDelayedExpansion
SET S2=!S1! WORLD^^!
ECHO !S2!
ENDLOCAL & SET S1=!S2!

ECHO %S1%
PAUSE

Вывод:

HELLO WORLD!
!S2!

Ожидаемый результат:

HELLO WORLD!
HELLO WORLD!

Спасибо.


person mcu    schedule 23.02.2012    source источник


Ответы (1)


Он работает так, как ожидалось.
Отложенное расширение будет расширять переменные во время выполнения, а не во время синтаксического анализа, поэтому оно интерпретирует вашу строку ENDLOCAL & SET S1=!S2! как
endlocal
Но в части SET S1=!S2! отложенное расширение отключено, поэтому оно может больше не расширяться.

В вашем случае вы можете использовать ENDLOCAL & SET S1=%S2%

Поскольку восклицательный знак S2 является «безопасным», так как отложенный exp. выключен в момент выполнения.

Но всегда безопасный возврат немного сложнее.
Мы обсуждали это на Dostips. : вернуть ЛЮБУЮ строку за границей ENDLOCAL

person jeb    schedule 23.02.2012