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.