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


263

Відповідно до цього , !==!є нерівним рядковим оператором. Спробувавши це, я отримую:

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

Що я роблю неправильно?

Відповіді:



105

Використовуйте натомість NEQ.

if "asdf" NEQ "fdas" echo asdf

37
для цього потрібно ввімкнути розширення команд (вони за замовчуванням є на 2000+, але їх можна вимкнути в системі або в параметрі до cmd.exe) Зазвичай ви повинні їх включати за допомогою setlocal, але для простого, якщо не рівного тесту, просто використовуйте "якщо ні", це повертається до старих добрих днів DOS
Андерса,

29

Я знаю, що це досить застаріло, але це все ще може бути корисним для тих, хто запізнюється на вечірку. (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", безумовно, шлях.


Дякую 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 та IF NOT ==) пропонуються будь-які підказки, з точки зору яких (неофіційно задокументовано) нативний API називає conhost.exe використовує?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.