Это распространенная проблема во многих языках сценариев. Проблема заключается в том, что имена переменных расширяются до значений до выполнения строки. Если переменная оставлена пустой, скрипт запустит код:
if ==word (goto oh)
Два знака равенства не анализируются как оператор равенства, потому что IF ожидает найти элемент для сравнения с обеих сторон. Вместо (goto
ожидается оператор, такой как EQU
, и сообщение об ошибке будет отражать это.
Аналогичная проблема возникнет, если пользователь введет строку, содержащую пробелы, например:
if what I typed==word (goto oh)
Такое поведение может быть использовано для всех видов грязного кода. Например, условие оценивается как истинное, если пользователь вводит слово «word», а также если он вводит «== word EQU», и в этом случае строка будет проанализирована как: if ==word EQU ==word (goto oh)
Обычно мы не хотим разбираться с этими крайними случаями слишком широко и можем избежать проблемы с пустыми переменными, добавив фиктивные символы, например: if %a%dummy==%b%dummy
. Таким образом, синтаксис будет действителен, даже если одна (или обе) переменные пусты. В пакетных файлах особенно полезным фиктивным символом является "-symbol", поскольку он также предотвращает анализ пробелов в качестве разделителей. Следующий код должен быть значительно более устойчивым:
if "%ui%"=="%word%" (goto oh)