Operatore batch non uguale (disuguaglianza)


272

In base a ciò , !==!è l'operatore di stringa non uguale. Provandolo, ottengo:

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

Che cosa sto facendo di sbagliato?

Risposte:



109

Usa invece NEQ.

if "asdf" NEQ "fdas" echo asdf

39
questo richiede che le estensioni dei comandi siano attivate (sono per impostazione predefinita su 2000+ ma possono essere disattivate a livello di sistema o come parametro di cmd.exe) Normalmente dovresti attivarle con setlocal, ma per un test semplice se non uguale, basta usare "se no", torna ai bei vecchi tempi del DOS
Anders

30

So che questo è abbastanza obsoleto, ma potrebbe ancora essere utile per chi arriva tardi alla festa. (EDIT: aggiornato poiché questo riceve ancora traffico e @Goozak ha sottolineato nei commenti che anche la mia analisi originale del campione era errata.)

Ho preso questo dal codice di esempio nel tuo link:

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==!è semplicemente un uso idiomatico ==per verificare che la cosa a sinistra, che contiene la tua variabile, sia diversa dalla cosa a destra, che non lo è. In !questo caso è solo un segnaposto di carattere. Potrebbe essere qualsiasi cosa. Se %1ha un contenuto, quindi l'uguaglianza sarà falso, se non ti basta essere confrontando !per !e sarà vero.

!==!non è un operatore, quindi la scrittura "asdf" !==! "fdas"è piuttosto priva di senso.

Il suggerimento da utilizzare if not "asdf" == "fdas"è sicuramente la strada da percorrere.


Grazie jatrim .. Sicuramente utile per chi cerca una risposta, piuttosto che fare di nuovo la domanda. Non è che StackExchange blocchi la possibilità di rispondere / commentare a causa dell'età delle domande, quindi pensa che questo sia completamente accettabile.
user66001

4
La !sono usati qui in caso %1è vuoto, risultando così nella prova !==!, che è vero. Potresti usare %1.==.invece (quasi tutti i personaggi andrebbero bene) - lo scopo è di assicurarti che entrambi i lati del test di uguaglianza abbiano qualcosa da testare. La !==!notazione NON è sicuramente un segno di non uguale. Meglio restare con if not ....
Goozak

24

Provare:

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

Per me funziona su Windows XP (ricevo lo stesso errore che hai per il codice che hai pubblicato).


5

NEQ viene solitamente utilizzato per i numeri e == viene generalmente utilizzato per il confronto delle stringhe.

Non riesco a trovare alcuna documentazione che menzioni un operando di disuguaglianza specifico ed equivalente per il confronto di stringhe (al posto di NEQ). La soluzione che utilizza IF NOT == sembra l'approccio più valido. Non riesco a pensare immediatamente a una circostanza in cui la valutazione delle operazioni in un file batch causerebbe un problema o un comportamento imprevisto quando si applica il metodo di confronto IF NOT == alle stringhe.

Vorrei poter offrire informazioni su come le due funzioni si comportano in modo diverso a un livello inferiore: il disassemblaggio di file batch separati (che utilizzano NEQ e IF NOT ==) offrirebbe indizi in termini di quali chiamate API native (documentate in modo non ufficiale) conhost.exe sta utilizzando?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.