Operatori logici (“e”, “o”) in batch DOS

Come implementeresti gli operatori logici nei file batch di DOS?

Puoi farlo and con condizioni nidificate:

 if %age% geq 2 ( if %age% leq 12 ( set class=child ) ) 

o:

 if %age% geq 2 if %age% leq 12 set class=child 

Puoi fare or con una variabile separata:

 set res=F if %hour% leq 6 set res=T if %hour% geq 22 set res=T if "%res%"=="T" ( set state=asleep ) 

L’istruzione IF non supporta gli operatori logici ( AND e OR ), le istruzioni IF cascata creano una congiunzione implicita.

 IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL 

Se esistono File1.Dat e File1.Dat saltare l’etichetta FILE12_EXIST_LABEL .

Vedi anche: IF /?

Le leggi di De Morgan ci permettono di convertire le disgiunzioni (“OR”) in equivalenti logici usando solo congiunzioni (“AND”) e negazioni (“NOT”). Ciò significa che possiamo concatenare disgiunzioni (“OR”) a una riga.

Questo significa che il nome è “Yakko” o “Wakko” o “Dot”, quindi fai eco a “Warner, fratello o sorella”.

 set warner=true if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false if "%warner%"=="true" echo Warner brother or sister 

Questa è un’altra versione dell’esempio “OR” di paxdiablo, ma le condizioni sono concatenate su una riga. (Si noti che l’opposto di leq è gtr , e l’opposto di geq è lss .)

 set res=true if %hour% gtr 6 if %hour% lss 22 set res=false if "%res%"=="true" set state=asleep 

I seguenti esempi mostrano come creare un’istruzione AND (utilizzata per impostare variabili o includere parametri per un comando).

Per chiudere la finestra CMD e avviare il Blocco note:

 exit & start notepad.exe 

Per impostare le variabili x, yez su valori se la variabile ‘a’ è uguale a blah.

 if %a% equ blah set x=1 & set y=2 & set z=3 

Spero possa aiutare!

Anche coperto in
“120} Come si usano gli operatori AND / OR / XOR / NOT in un’istruzione IF?”
http://www.netikka.net/tsneti/info/tscmd120.htm

O è leggermente ingannevole, ma non eccessivamente. Ecco un esempio

 set var1=%~1 set var2=%~2 :: set or_= if "%var1%"=="Stack" set or_=true if "%var2%"=="Overflow" set or_=true if defined or_ echo Stack OR Overflow 

Un’alternativa è cercare una shell unix che ti dia operatori logici e molto altro ancora. È ansible ottenere un’implementazione nativa di Win32 di una shell Bourne qui se non si desidera seguire la rotta cygwin. Un bash nativo può essere trovato qui . Sono abbastanza sicuro che potresti facilmente google altre buone alternative come zsh o tcsh.

K

Prova l’operazione di negazione – “non”!

Bene, se è ansible eseguire l’operazione “AND” su un’istruzione if usando “if” annidato (consultare le risposte precedenti), allora si può fare la stessa cosa con “if not” per eseguire un’operazione “o”.

Se non hai ancora avuto l’idea, continua a leggere. Altrimenti, non perdere tempo e torna alla programmazione.

Proprio come nidificati ‘se sono soddisfatti solo quando tutte le condizioni sono vere, annidate’ se non sono soddisfatte solo quando tutte le condizioni sono false. Questo è simile a quello che vuoi fare con un ‘o’ operando, non è vero?

Anche quando una delle condizioni in “se non” nidificata è vera, l’intera affermazione rimane non soddisfatta. Quindi, puoi usare negato ‘if’ in successione ricordando che il corpo dell’istruzione condizionale dovrebbe essere quello che vuoi fare se tutte le tue condizioni nidificate sono false. Il corpo che in realtà volevi dare dovrebbe rientrare nella dichiarazione else.

E se non hai ancora capito la cosa, scusa, ho 16 anni e questo è il meglio che posso fare per spiegare.

Athul Prakash (all’età 16 anni) ha dato un’idea logica su come implementare un test OR negando le condizioni nelle istruzioni IF e quindi utilizzando la clausola ELSE come posizione per inserire il codice che richiede l’esecuzione. Ho pensato a me stesso che ci sono comunque due clausole altrimenti di solito necessarie poiché suggerisce di usare due istruzioni IF, e quindi il codice eseguito deve essere scritto due volte . Tuttavia, se viene utilizzato un GOTO per ignorare il codice richiesto, invece di scrivere le clausole ELSE, il codice per l’esecuzione deve essere scritto una sola volta .

Ecco un esempio verificabile di come implementare la logica negativa di Athul Prakash per creare un OR .

Nel mio esempio, a qualcuno è permesso guidare un carro armato se hanno una licenza di serbatoio O stanno facendo il loro servizio militare . Inserisci vero o falso nei due messaggi e sarai in grado di vedere se la logica ti permette di guidare un carro armato.

 @ECHO OFF @SET /p tanklicence=tanklicence: @SET /p militaryservice=militaryservice: IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice% :done PAUSE 

È facile come il seguente:

AND> if + if

 if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something* 

O> se // se

 set BOTH=0 if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1 if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something* if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something* 

So che ci sono altre risposte, ma penso che la mia sia più semplice, quindi più facile da capire. Spero che questo ti aiuti! 😉

Se ti interessa scrivere un + if AND / OR in una dichiarazione, allora non ce n’è nessuna. Ma puoi ancora raggruppare if con && / || e ( / ) istruzioni per ottenere ciò che vuoi in una riga senza alcuna variabile addizionale e senza if-else duplicazione di blocchi (comando single echo per sezioni di codice TRUE e FALSE ):

 @echo off setlocal set "A=1" & set "B=2" & call :IF_AND set "A=1" & set "B=3" & call :IF_AND set "A=2" & set "B=2" & call :IF_AND set "A=2" & set "B=3" & call :IF_AND echo. set "A=1" & set "B=2" & call :IF_OR set "A=1" & set "B=3" & call :IF_OR set "A=2" & set "B=2" & call :IF_OR set "A=2" & set "B=3" & call :IF_OR exit /b 0 :IF_OR ( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+ exit /b 0 :IF_AND ( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE- exit /b 0 

Uscita :

 TRUE+ FALSE- FALSE- FALSE- TRUE+ TRUE+ TRUE+ FALSE- 

Il trucco è nel comando type che rilascia / imposta il errorlevel e così gestisce la strada per il prossimo comando.

Leggera modifica alla risposta di Andry, riducendo i comandi di tipo duplicato:

 set "A=1" & set "B=2" & call :IF_AND set "A=1" & set "B=3" & call :IF_AND set "A=2" & set "B=2" & call :IF_AND set "A=2" & set "B=3" & call :IF_AND echo. set "A=1" & set "B=2" & call :IF_OR set "A=1" & set "B=3" & call :IF_OR set "A=2" & set "B=2" & call :IF_OR set "A=2" & set "B=3" & call :IF_OR goto :eof :IF_OR (if /i not %A% EQU 1 ( if /i not %B% EQU 2 ( echo FALSE- type 2>nul ) )) && echo TRUE+ goto :eof :IF_AND (if /i %A% EQU 1 ( if /i %B% EQU 2 ( echo TRUE+ type 2>nul ) )) && echo FALSE- goto :eof