Оператор пакетного неравного (неравенства)

Согласно this, !==! - это неравномерный строковый оператор. Попытка, я получаю:

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

Что я делаю неправильно?

Ответ 1

Пытаться

if NOT "asdf" == "fdas" echo asdf

Ответ 2

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

if "asdf" NEQ "fdas" echo asdf

Ответ 3

Я знаю, что это совсем устарело, но это может быть полезно для тех, кто опаздывает на вечеринку. (EDIT: обновлено, так как это все еще получает трафик, а @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" - это, безусловно, путь.

Ответ 4

Try:

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

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

Ответ 5

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

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

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