Nierównomierny (nierówny) operator partii

263

Zgodnie z tym , !==!jest nie równy operator ciąg. Próbując, otrzymuję:

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

Co ja robię źle?

ripper234
źródło

Odpowiedzi:

492

Próbować

if NOT "asdf" == "fdas" echo asdf
Frank Bollack
źródło
105

Zamiast tego użyj NEQ.

if "asdf" NEQ "fdas" echo asdf
demoncodemonkey
źródło
37
wymaga to włączenia rozszerzeń poleceń (są one domyślnie w wersji 2000+, ale można je wyłączyć w całym systemie lub jako parametr do cmd.exe). Zwykle należy je włączyć przy pomocy setlocal, ale dla prostego, jeśli nie równego testu, po prostu użyj „jeśli nie”, to wraca do starych dobrych czasów DOS
Anders
29

Wiem, że to dość nieaktualne, ale może być przydatne dla osób spóźniających się na przyjęcie. (EDYCJA: zaktualizowana, ponieważ ruch nadal jest generowany, a @Goozak zauważył w komentarzach, że moja pierwotna analiza próbki również była nieprawidłowa).

Ściągnąłem to z przykładowego kodu w twoim linku:

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==!to po prostu idiomatyczne użycie ==mające na celu sprawdzenie, czy rzecz po lewej stronie, która zawiera twoją zmienną, różni się od rzeczy po prawej, która tego nie robi. W !tym przypadku jest to tylko symbol zastępczy znaku. To może być cokolwiek. Jeśli %1ma treść, to równość będzie fałszywe, jeśli nie będziesz po prostu być porównanie !do !i będzie to prawda.

!==!nie jest operatorem, więc pisanie "asdf" !==! "fdas"jest dość nonsensowne.

Sugestia użycia if not "asdf" == "fdas"jest zdecydowanie najlepszym rozwiązaniem.

jatrim
źródło
Dzięki jatrim .. Zdecydowanie pomocny dla tych, którzy szukają odpowiedzi, zamiast zadawać pytania ponownie. To nie jest tak, że StackExchange blokuje możliwość odpowiadania / komentowania ze względu na wiek pytań, więc myśl, że jest to w pełni akceptowalne.
user66001
4
!Stosowane są tutaj w razie %1jest pusta, co skutkuje w teście !==!, który jest prawdziwy. Możesz użyć %1.==.zamiast tego (zrobiłaby to prawie każda postać) - celem jest upewnienie się, że obie strony testu równości mają coś do przetestowania. !==!Notacja jest zdecydowanie NIE nie-znak równości. Lepiej trzymaj się if not ....
Goozak
22

Próbować:

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

Działa to dla mnie w systemie Windows XP (pojawia się taki sam błąd jak w przypadku opublikowanego kodu).

Dominic Rodger
źródło
4

NEQ jest zwykle używane do liczb, a == jest zwykle używane do porównywania ciągów.

Nie mogę znaleźć żadnej dokumentacji, która wymienia konkretny i równoważny operand nierówności do porównywania ciągów (zamiast NEQ). Rozwiązanie wykorzystujące IF NOT == wydaje się najbardziej rozsądnym podejściem. Nie mogę natychmiast pomyśleć o okolicznościach, w których ocena operacji w pliku wsadowym spowodowałaby problem lub nieoczekiwane zachowanie podczas stosowania metody porównywania IF NOT == do ciągów.

Chciałbym móc zaoferować wgląd w to, jak te dwie funkcje zachowują się inaczej na niższym poziomie - dezasemblowanie oddzielnych plików wsadowych (które używają NEQ i JEŻELI NIE ==) oferuje wszelkie wskazówki, w odniesieniu do których (nieoficjalnie udokumentowane) natywne API wywołuje conhost.exe wykorzystuje?

Paweł
źródło