2008-10-20 3 views
0

Что будет отображаться в сегменте кода DOS .bat? Зачем? (то есть почему он не ведет себя так, как вы могли бы сначала подумать)?Неожиданное поведение переменной subst в файле DOS .bat

множество ВАР = перед тем

, если "% VAR%" == "до" (

множество ВАР = после того, как;

эхо% ВДП%

)

[Я знаю ответ на этот вопрос, но счел это достаточно ценным для публикации]

ответ

2

Очевидное вы думаете, что выход будет «после», учитывая, что мы перезапускаем переменную env внутри цикла.

Но выход будет фактически «до». Причина в том, что подстановка переменных выполняется в .bat-файлах интерпретатором при чтении команды, а не при ее выполнении. Таким образом, для составного оператора переменные в теле оцениваются, когда оператор if встречается впервые.

Вы можете сделать эту работу, используя расширенное расширение переменной среды (необходимо включить ее). Если он включен, вы можете сделать:

набор VAR = перед тем

если "% VAR%" == "перед" (

набор VAR = после;

эхо вар!

)

Вы можете включить отложенное расширение переменных среды, используя параметр/v при запуске cmd.exe.

[Backstory - многие из нас по-прежнему используют устаревшие .bat-файлы для управления такими вещами, как make-процедуры и т. Д. Очевидно, что есть более эффективные инструменты для написания сценариев, но не всегда возможность их использовать. Я столкнулся с этим вопросом некоторое время назад и недавно нашел двух других людей, которые вытащили свои волосы за одно и то же. Поэтому полезно понять, как интерпретатор выполняет замену переменных].

0

Замена% VAR% происходит до выполнения команды. Несмотря на то, что несколько команд распределены по нескольким строкам, группировка их в parens (...) заставляет парсер cmd.exe читать все это как одну команду. Итак, что выполняется, выглядит так:

set VAR=before 

if "before" == "before" (

set VAR=after; 

echo before 

) 

переводчик.

Это одна из многих вещей, которые делают обработку пакетного файла довольно болезненной курицей, пытающейся сделать что-то большее, чем простой материал.

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

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