Пакетный оператор неравенства (неравенства)


265

В соответствии с этим , !==!является неравным оператором строки. Пробуя это, я получаю:

C:\> if "asdf" !==! "fdas" echo asdf
!==! was unexpected at this time.

Что я делаю не так?

Ответы:



106

Вместо этого используйте NEQ.

if "asdf" NEQ "fdas" echo asdf

38
это требует включения расширений команд (они по умолчанию на 2000+, но могут быть отключены во всей системе или в качестве параметра cmd.exe) Обычно вы должны включать их с помощью setlocal, но для простого, если не равного теста, просто используйте «если нет», это восходит к старым добрым дням DOS
Anders

30

Я знаю, что это довольно устарело, но это может быть полезно для тех, кто опаздывает на вечеринку. (РЕДАКТИРОВАТЬ: обновлено, поскольку это все еще получает трафик, и @Goozak указал в комментариях, что мой первоначальный анализ выборки также был неверным.)

Я вытащил это из примера кода в вашей ссылке:

IF !%1==! GOTO VIEWDATA
REM  IF NO COMMAND-LINE ARG...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  PRINT LINE WITH STRING MATCH, THEN EXIT.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  SHOW ENTIRE FILE, 1 PAGE AT A TIME.

:EXIT0

!%1==!это просто идиоматическое использование, ==предназначенное для проверки того, что вещь слева, которая содержит вашу переменную, отличается от вещи справа, которая не делает. В !этом случае это просто символ заполнителя. Это может быть что угодно. Если %1есть содержание, то равенство будет ложным, если это не вы будете просто быть по сравнению !с , !и это будет правдой.

!==!не оператор, поэтому написание "asdf" !==! "fdas"довольно бессмысленно.

Предложение использовать if not "asdf" == "fdas", безусловно, путь.


Спасибо jatrim .. Наиболее определенно полезно для тех, кто ищет ответ, а не задавать вопрос снова. Это не значит, что StackExchange блокирует возможность отвечать / комментировать из-за возраста вопросов, поэтому думаю, что это вполне приемлемо.
user66001

4
!Используются здесь в случае %1пусто, таким образом , в результате испытания !==!, это верно. Вы можете использовать %1.==.вместо этого (подходит почти любой символ), чтобы убедиться, что обе стороны теста на равенство имеют что-то для тестирования. !==!Обозначения определенно НЕ не-знак равенства. Лучше придерживаться if not ....
Goozak

22

Пытаться:

if not "asdf" == "fdas" echo asdf

Это работает для меня в Windows XP (я получаю ту же ошибку, что и вы для кода, который вы разместили).


4

NEQ обычно используется для чисел, а == обычно используется для сравнения строк.

Я не могу найти документацию, в которой упоминается конкретный и эквивалентный операнд неравенства для сравнения строк (вместо NEQ). Решение, использующее IF NOT ==, кажется наиболее разумным подходом. Я не могу сразу думать об обстоятельствах, при которых оценка операций в пакетном файле может вызвать проблему или неожиданное поведение при применении метода сравнения IF NOT == к строкам.

Я хотел бы предложить понимание того, как две функции ведут себя по-разному на более низком уровне - будет ли дизассемблирование отдельных пакетных файлов (использующих NEQ и ЕСЛИ НЕ ==) предлагать какие-либо подсказки, в отношении которых (неофициально задокументировано) родной API-вызов вызывает conhost.exe использует?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.