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


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.