Цель CALL или GOTO никогда не должна быть внутри оператора блока в скобках.Это можно сделать, но, как вы видите, результаты, вероятно, не будут такими, как вы хотите.
Вся конструкция IF (...) ELSE (...) анализируется и загружается в память передлюбая из них обрабатывается.Другими словами, это логически рассматривается как одна строка кода.После его анализа CMD.EXE ожидает возобновления синтаксического анализа, начиная со следующей строки после конструкции IF / ELSE.
После фазы анализа сложная команда выполняется из памяти.Предложение IF обрабатывается правильно, а предложение ELSE пропускается правильно.НО в предложении IF (true) вы выполняете GOTO :asdf
, поэтому CMD.EXE должным образом начинает поиск метки.Он начинается в конце IF / ELSE и сканирует до конца файла, возвращается к началу и сканирует, пока не найдет метку.Возможно, метка находится в вашем предложении IF, но сканер меток ничего не знает об этой детали.Поэтому, когда сложная команда завершает выполнение из памяти, пакетная обработка возобновляется с метки, а не с конца комплексного IF / ELSE.
Таким образом, в этот момент пакетный процессор видит и выполняет следующие несколько строк
echo baz
) else (
echo quux
)
baz повторяется, как и quux.Но вы можете спросить: «Почему ) else (
и / или )
не генерируют синтаксическую ошибку, поскольку они теперь не сбалансированы и больше не анализируются как часть более крупного оператора IF?
Это происходит из-закак обрабатывается )
.
Если при открытии )
есть активное открытие (
, то )
обрабатывается так, как вы ожидаете.
Но еслисинтаксический анализатор ожидает команду и находит )
, когда нет активного открытия (
, тогда )
игнорируется и все символы в оставшейся части строки игнорируются! Фактически )
теперь работает какОперативное заявление.