2016-05-04 1 views
1

У меня есть пакетный скрипт для Windows с именем test.bat следующим образом:ECHO странное поведение, когда внутри IF блока

@ECHO OFF 
SETLOCAL 
SET name=Dan 
SET greeting=Hi %name%, how are you? 
ECHO %greeting% 

При выполнении я получаю следующий результат:

Hi Dan, how are you? 

Это то, что я ожидал. Я сменил сценарий на следующее:

@ECHO OFF 
SETLOCAL 
IF EXIST test.bat (
    SET name=Dan 
    SET greeting=Hi %name%, how are you 
    ECHO %greeting% 
) ELSE (
    ECHO Nofile 
) 

Я бы ожидал получить тот же результат. Вместо этого я получаю следующее:

ECHO is off. 

Пожалуйста, помогите мне понять почему.

ответ

4

вам нужно delayed expansion:

@ECHO OFF 
SETLOCAL enableDelayedExpansion 
IF EXIST test.bat (
    SET name=Dan 
    SET greeting=Hi !name!, how are you 
    ECHO !greeting! 
) ELSE (
    ECHO Nofile 
) 

Пакетные файлы имеют две фазы прочтения сценария - выполнение и синтаксический. Во время фазы синтаксического анализа все переменные, заключенные в %, заменяются, а во время выполнения команды выполняются. С задержкой расширения включил переменных, заключенных с ! будет расширен во время фазы выполнения (то есть позже)

Кронштейны на другой стороне (а также &) помещает команды в блок принимается за одну команду, так что все переменные с % заменяются в течение первой фазы, и когда вы устанавливаете переменные, вам потребуется отсроченное расширение.

+0

Можете ли вы разработать? Меня больше интересует понимание того, что происходит, чем решение. –

+0

@DanStevens - объясняется в ссылке, хотя я обновлю ответ – npocmaka

+0

Это замечательно. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^