У меня проблемы с использованием операторов IF в командном файле. Я настроил его с помощью набора /p, но когда код попадает в оператор IF, он закрывается. Этот файл описывает, что я имею в виду:

@echo off  
set res1=word  
echo put in word.  
set /p ui=  
if %ui%==%res1% (goto oh)  
echo You put nothing in!  
pause  
:oh  
echo oh.  
pause

Запуск и ничего не вставляя, приводит к сбою, НЕ повторяя текст и делая паузу. Что я делаю неправильно?

3 ответа3

3

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

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)
2
If x%ui%x==x%res1%x

Не должно быть x . Это просто трюк, чтобы учесть пустой конец var.

Я обычно использую "%ui%"=="%res1%" потому что это больше похоже на настоящий язык.

Я узнал об этом от ss64.com. Давным-давно. Отличный сайт.

Изменить: Квадратные скобки является более безопасным вариантом, как указано ниже.

1

Решение Майкла добавить двойные кавычки может быть проблематичным, если в тестируемом значении есть двойные кавычки. Менее вероятно, что это вызовет проблемы, если использовать квадратные скобки:

IF [%1]==[/?] ...

С сайта Роба Ван дер Вуде

Если сам% 1 может содержать кавычки, у вас проблемы: если% 1 равно "/?"включая кавычки, ЕСЛИ"% 1 "=="/?"... оценивает как IF" "/?"" == "/?"... который выдаст сообщение об ошибке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .