Пакет: Возвращение значения из SETLOCAL EnableDelayedExpansion - PullRequest
4 голосов
/ 23 февраля 2012

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

@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!

Спасибо.

1 Ответ

9 голосов
/ 23 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...