Batch ungleicher (Ungleichungs-) Operator

263

Nach diesem , !==!ist der Ungleich-String - Operator. Wenn ich es versuche, bekomme ich:

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

Was mache ich falsch?

ripper234
quelle

Antworten:

492

Versuchen

if NOT "asdf" == "fdas" echo asdf
Frank Bollack
quelle
105

Verwenden Sie stattdessen NEQ.

if "asdf" NEQ "fdas" echo asdf
Dämoncodemonkey
quelle
37
Dazu müssen Befehlserweiterungen aktiviert sein (sie sind standardmäßig ab 2000 verfügbar, können jedoch systemweit oder als Parameter für cmd.exe deaktiviert werden.) Normalerweise sollten Sie sie mit setlocal aktivieren, aber für einen einfachen, wenn nicht gleichwertigen Test. Verwenden Sie einfach "wenn nicht", es geht zurück auf die guten alten DOS-Tage
Anders
29

Ich weiß, dass dies ziemlich veraltet ist, aber dies könnte immer noch nützlich sein für diejenigen, die zu spät zur Party kommen. (BEARBEITEN: aktualisiert, da dies immer noch Verkehr bekommt und @Goozak in den Kommentaren darauf hingewiesen hat, dass meine ursprüngliche Analyse der Stichprobe ebenfalls falsch war.)

Ich habe dies aus dem Beispielcode in Ihrem Link gezogen:

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==!ist einfach eine idiomatische Verwendung von ==, um zu überprüfen, ob sich das Objekt links, das Ihre Variable enthält, von dem Objekt rechts unterscheidet, das dies nicht tut. Das ist !in diesem Fall nur ein Zeichenplatzhalter. Es könnte alles sein. Wenn %1Inhalt hat, dann wird die Gleichheit falsch sein, wenn es nicht werden Sie nur seinen Vergleich !zu !und wird es wahr sein.

!==!ist kein Operator, daher ist das Schreiben "asdf" !==! "fdas"ziemlich unsinnig.

Der zu verwendende Vorschlag if not "asdf" == "fdas"ist definitiv der richtige Weg.

Jatrim
quelle
Danke jatrim . Auf jeden Fall hilfreich für diejenigen, die nach einer Antwort suchen, anstatt die Frage erneut zu stellen. Es ist nicht so, dass StackExchange die Fähigkeit zum Beantworten / Kommentieren aufgrund des Alters der Fragen blockiert. Denken Sie also, dass dies völlig akzeptabel ist.
user66001
4
Die !werden hier verwendet, falls %1leer ist, was zu dem Test führt !==!, der wahr ist. Sie können %1.==.stattdessen verwenden (fast jedes Zeichen würde dies tun) - um sicherzustellen, dass beide Seiten des Gleichheitstests etwas zu testen haben. Die !==!Notation ist definitiv NICHT ein nicht-Gleichheitszeichen. Bleib lieber bei if not ....
Goozak
22

Versuchen:

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

Das funktioniert bei mir unter Windows XP (ich erhalte den gleichen Fehler wie Sie für den von Ihnen geposteten Code).

Dominic Rodger
quelle
4

NEQ wird normalerweise für Zahlen verwendet und == wird normalerweise für den Zeichenfolgenvergleich verwendet.

Ich kann keine Dokumentation finden, in der ein spezifischer und äquivalenter Ungleichungsoperand für den Zeichenfolgenvergleich (anstelle von NEQ) erwähnt wird. Die Lösung mit IF NOT == scheint der fundierteste Ansatz zu sein. Ich kann mir nicht sofort einen Umstand vorstellen, unter dem die Auswertung von Vorgängen in einer Batchdatei ein Problem oder unerwartetes Verhalten verursachen würde, wenn die Vergleichsmethode IF NOT == auf Zeichenfolgen angewendet wird.

Ich wünschte, ich könnte einen Einblick in das unterschiedliche Verhalten der beiden Funktionen auf einer niedrigeren Ebene geben - würde das Zerlegen separater Batchdateien (die NEQ und IF NOT == verwenden) Hinweise darauf geben, welche (inoffiziell dokumentierten) nativen APIs conhost.exe aufrufen nutzt?

Paul
quelle