Це поширена проблема багатьох мов сценаріїв. Проблема полягає в тому, що імена змінних розширюються до їх значень перед виконанням рядка. Якщо змінну залишити порожньою, сценарій запустить код:
if ==word (goto oh)
Два знаки рівності не розбираються як оператор рівності, оскільки ІФ розраховує знайти предмет для порівняння з обох сторін. Замість цього (goto
оператор, як EQU
очікується, і повідомлення про помилку відображатиме це.
Аналогічна проблема виникне, якщо користувач введе рядок, що містить пробіли, наприклад:
if what I typed==word (goto oh)
Така поведінка може використовуватися для різного роду брудного коду. В якості прикладу, умова буде оцінювати справжнє значення, якщо користувач вводить «слово», а й , якщо він входить в «== слово EQU», в цьому випадку рядок буде розібрана як: if ==word EQU ==word (goto oh)
. Як правило, ми не хочемо мати справу з цими крайніми випадками занадто широко і можемо уникнути проблем з порожніми змінним шляхом додавання фіктивних символів, наприклад: if %a%dummy==%b%dummy
. Таким чином, синтаксис буде дійсним, навіть якщо одна (або обидві) змінних порожні. У пакетних файлах особливо корисним символом манекена є "-символ, оскільки він також запобігає розбору пробілів як роздільники. Наступний код повинен бути значно надійнішим:
if "%ui%"=="%word%" (goto oh)