Simbolo equivalente a NEQ, LSS, GTR, ecc. Nei file batch di Windows

In batch, utilizzo sempre == quando si utilizza il comando if . (Ad esempio: if "19"=="3" echo My computer doesnt know maths )

Che dire di tutti gli altri ( LSS , LEQ , NEQ , ecc.)? Non c’è qualcosa di simile != Per NEQ , o sto pensando Unix?

La ragione per cui voglio usare i simboli è perché pensavo che qualcuno avesse detto sia per il testo che per i numeri, i simboli erano più efficienti dell’uso delle varianti del testo.

Ad ogni modo, mi piacerebbe ancora saperlo. Grazie.

    Il motivo per cui operatori come > non vengono utilizzati è perché hanno significati speciali negli script di shell. > È usato per redirect l’output; < utilizzato per redirect l'input, ecc.

    La documentazione di Microsoft elenca i seguenti operatori:

     Operator | Description EQU | equal to NEQ | not equal to LSS | less than LEQ | less than or equal to GTR | greater than GEQ | greater than or equal to 

    Inoltre, la parola not viene utilizzata per annullare una condizione.

    La ragione per cui voglio usare i simboli è perché pensavo che qualcuno avesse detto sia per il testo che per i numeri, i simboli erano più efficaci rispetto all'utilizzo delle varianti di testo.

    Probabilmente si riferivano a bash e al suo ampio catalogo di operatori. Fornisce operatori diversi per operandi interi e stringhe.

    Il comando interno di Windows IF ha per impostazione predefinita solo due operatori:

    1. == che esegue un confronto tra stringhe dei due argomenti sull’eguaglianza, ovvero usa strcmp con condizione true su strcmp restituisce 0.
    2. not in combinazione con == per invertire il risultato del confronto tra stringhe sull’uguaglianza, cioè la condizione è vera se le due stringhe confrontate non sono uguali.

    Quindi la riga di comando:

     if "19"=="3" echo My computer doesn't know maths 

    esegue strcmp con le stringhe "19" e "3" che significa che i flussi di byte confrontati sono esadecimali 22 31 39 22 00 e 22 33 22 00 . Le virgolette non vengono rimosse prima di eseguire il confronto delle stringhe. Sono inclusi nel confronto tra stringhe.

    Una guida per il comando IF viene emessa quando si esegue in una finestra del prompt dei comandi il comando if /? . Questo aiuto spiega tutte le opzioni e gli operatori aggiuntivi che possono essere utilizzati per avere le estensioni di comando abilitate come predefinite.

    C’è l’opzione /I per confrontare i due argomenti senza distinzione tra maiuscole e minuscole usando stricmp invece di strcmp .

    Esempio:

     if /I not "%~1" == "/I" echo First argument is neither /i nor /I. 

    E con le estensioni di comando abilitate ci sono gli operatori di confronto aggiuntivi: EQU , NEQ , LSS , LEQ , GTR , GEQ

    Le parentesi angolari < e > vengono utilizzate sulla riga di comando di Windows come operatori di reindirizzamento . Quindi non possono essere usati come operatori di confronto su una condizione IF . Anche punto esclamativo ! non è disponibile come operatore perché significa inizio / fine di un riferimento di variabile di ambiente in caso di espansione ritardata della variabile di ambiente abilitata. Esegui il set /? e setlocal /? e endlocal /? per i dettagli sull'espansione della variabile di ambiente ritardata.

    L'interprete dei comandi di Windows tenta di convertire entrambe le stringhe degli argomenti in numeri interi a 32 bit con strtol con base 0 (rilevamento automatico della base) sull'utilizzo di EQU , NEQ , LSS , LEQ , GTR , GEQ . Un confronto di numeri interi viene eseguito se questo ha esito positivo per entrambe le stringhe di argomenti poiché le due stringhe confrontate sono numeri decimali o numeri esadecimali che iniziano con 0x o numeri ottali che iniziano con 0 . In caso contrario, le stringhe dei due argomenti vengono confrontate nuovamente con strcmp e l'operatore di confronto viene applicato al risultato intero di questa funzione.

    La conversione di entrambi gli argomenti di stringa in interi a 32 bit firmati richiede alcune istruzioni aggiuntive sul processore (alcuni nanosecondi o microsecondi a seconda delle prestazioni della CPU). Un confronto tra interi è quindi un po 'più lento, ma non molto più lento.

    Esempi:

     if 014 EQU 12 echo Octal number 014 is equal decimal number 12. if 0x0C EQU 12 echo Hexadecimal number 0C is equal decimal number 12. if /I 0X0C EQU 014 Hexadecimal number 0C is equal octal number 014. 

    L'opzione /I viene ignorata utilizzando un operatore di confronto diverso da == e entrambe le stringhe sono costituite solo da cifre numeriche in cui il primo carattere può essere anche un trattino interpretato come segno meno. Ciò è dimostrato dalla terza riga sopra.

    Se uno dei due argomenti è racchiuso tra virgolette sull'utilizzo di EQU , NEQ , LSS , LEQ , GTR , GEQ o una delle due stringhe non è una stringa che rappresenta un numero intero, il confronto viene sempre eseguito con l'uso di strcmp o stricmp seconda dell'uso di /I strcmp e stricmp restituiscono sia un intero come risultato che può essere un numero negativo, zero o un numero positivo. Questo risultato intero viene confrontato con il valore intero 0 base all'operatore utilizzato.

    Esempi:

     if 010 NEQ "10" echo String 010 is not equal string "10". if "100" LSS "20" echo String "100" is less than string "20". 

    Il secondo carattere 1 sul lato sinistro ha un valore di codice più basso (49 = 0x31) come secondo carattere 2 sul lato destro (50 = 0x32) che risulta in strcmp restituisce un valore negativo risultante nel function result LSS 0 è vero.

    Si noti che le variabili di ambiente di Windows sono sempre di tipo stringa e devono essere convertite sempre da stringa a numero intero utilizzando il confronto integer o l'aritmetica dei numeri interi.

    Nella maggior parte dei casi è consigliabile usare string1 == string2 o not string1 == string2 invece di string1 EQU string2 o string1 NEQ string2 sul confronto di due stringhe che non rappresentano valori integer per utilizzare direttamente strcmp o stricmp . Altrimenti, confrontando le stringhe con EQU o NEQ vengono sprecati solo alcuni nanosecondi o microsecondi lasciando che il comando comandi di Windows utilizzi prima strtol che non riesce a convertire una delle due stringhe da confrontare e quindi cmd.exe esegue il successivo strcmp o stricmp come sarebbe fatto immediatamente sull'uso dell'operatore == .

    Un altro fatto importante:

    Una stringa anziché un confronto intero sull'utilizzo dei comparatori EQU , NEQ , LSS , LEQ , GTR , GEQ viene elaborata da cmd.exe all'esecuzione della condizione IF solo nel caso in cui uno dei due argomenti contenga un carattere non valido. Un confronto tra numeri interi viene comunque eseguito su una condizione fuori intervallo, come un argomento è inferiore a -2147483648 o superiore a 2147483647 come illustrato in risultati strani con IF .

    La limitazione dell'intervallo di valori può essere aggirata confrontando due valori come stringhe su cui entrambe le stringhe di valore hanno lo stesso numero di cifre. Ecco un esempio per scoprire se un file ha due o più GiB , ovvero la dimensione del file è 2147483648 o più byte.

     @echo off setlocal EnableExtensions DisableDelayedExpansion if "%~1" == "" ( set "FileName=%~f0" ) else set "FileName=%~1" for %%I in ("%FileName%") do set "FileSize=000000000000000%%~zI" if "%FileSize:~-16%" GEQ "0000002147483648" ( echo "%FileName%" is greater or equal 2 GiB. ) else echo "%FileName%" is less than 2 GiB. endlocal pause 

    La dimensione del file del file di cui viene passato il nome al file batch viene assegnata alla variabile di ambiente FileSize come stringa con almeno 15 cifre zero aggiuntive all'inizio.

    E dopo viene confrontata la stringa FileSize con solo le ultime 16 cifre con la stringa 0000002147483648 rappresenta 2 GiB in byte. strcmp confronta le due stringhe di uguale lunghezza byte per byte per cui ogni byte delle due stringhe confrontate può avere solo i valori esadecimali da 0x30 a 0x39. strcmp restituisce immediatamente un valore negativo se il byte corrente dalla stringa sinistra è inferiore al byte corrente dalla stringa destra, il che significa che la dimensione del file è inferiore a 2 GiB. strcmp ritorna immediatamente con un valore positivo se il byte corrente dalla stringa sinistra è maggiore del byte corrente dalla stringa destra, il che significa che la dimensione del file è maggiore di 2 GiB. strcmp ritorna con zero sulle due stringhe sono identiche al 100% il che significa che la dimensione del file è esattamente di 2 GiB.

    Si noti che confrontare i valori utilizzando un confronto di stringhe richiede che entrambi i valori abbiano lo stesso numero di cifre per un risultato accurato. La stringa del valore con meno cifre deve essere anteposta con la giusta quantità di 0 .