Risposte:
Puoi fare and
con le 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
)
set res=
o set res=1
e quindi if defined res
che è un po 'più robusto contro i refusi e funziona anche in blocchi senza consentire esplicitamente l'espansione ritardata.
L' IF
istruzione non supporta gli operatori logici ( AND
e OR
), le IF
istruzioni a cascata formano una congiunzione implicita.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Se File1.Dat
ed File1.Dat
esiste, quindi saltare l'etichettaFILE12_EXIST_LABEL
.
Guarda anche: IF /?
Le leggi di De Morgan ci consentono di convertire le disgiunzioni ("OR") in equivalenti logici usando solo congiunzioni ("AND") e negazioni ("NOT"). Ciò significa che possiamo concatenare disgiunzioni ("OR") su una riga.
Questo significa che se il nome è "Yakko" o "Wakko" o "Dot", allora 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. (Nota 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
Gli esempi seguenti mostrano come creare un'istruzione AND (utilizzata per impostare variabili o includere parametri per un comando).
Per avviare Blocco note e chiudere la finestra CMD:
start notepad.exe & exit
Per impostare le variabili x, ye z su valori se la variabile 'a' è uguale a blah.
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
Spero che aiuti!
O è leggermente complicato, 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
Athul Prakash (16 anni all'epoca) ha dato un'idea logica di come implementare un test OR negando le condizioni nelle istruzioni IF e quindi usando la clausola ELSE come posizione per inserire il codice che richiede l'esecuzione. Ho pensato a me stesso che ci sono comunque altre due clausole di solito necessarie poiché sta suggerendo di usare due istruzioni IF, e quindi il codice eseguito deve essere scritto due volte . Tuttavia, se si utilizza un GOTO per saltare il codice richiesto, invece di scrivere clausole ELSE, il codice per l'esecuzione deve essere scritto solo una volta .
Ecco un esempio verificabile di come implementerei 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 carro armato O stanno facendo il loro servizio militare . Inserisci vero o falso ai due messaggi e sarai in grado di vedere se la logica ti consente 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
Se sei interessato a scrivere un if
+ AND
/ OR
in un'istruzione, non ce n'è nessuna. Tuttavia, è ancora possibile raggruppare if
con &&
/ ||
e (
/ )
istruzioni per ottenere ciò che si desidera in una riga senza variabili aggiuntive e senza if-else
duplicazione del blocco ( echo
comando singolo per TRUE
e FALSE
sezioni di codice):
@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 sta nel type
comando che rilascia / imposta il errorlevel
e quindi gestisce la strada per il comando successivo.
Prova l'operando di negazione - "no"!
Bene, se puoi eseguire un'operazione 'AND' su un'istruzione if usando if nidificati (fai riferimento alle risposte precedenti), allora puoi 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 se i nidificati fossero soddisfatti solo quando tutte le condizioni sono vere, i nidificati se non fossero soddisfatti solo quando tutte le condizioni fossero false. È simile a quello che vuoi fare con un operando 'o', non è vero?
Anche quando una delle condizioni nel nidificato "se non" è vera, l'intera affermazione rimane non soddisfatta. Quindi, puoi usare "if's in successione negato" ricordando che il corpo dell'istruzione condition dovrebbe essere quello che vuoi fare se tutte le tue condizioni nidificate sono false. Il corpo che in realtà volevi dare dovrebbe rientrare nell'affermazione else.
E se non hai ancora capito bene, mi dispiace, ho 16 anni ed è il massimo che posso fare per spiegare.
È semplice quanto il seguente:
AND> if + if
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
OPPURE> if // if
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! ;)
Un'alternativa è cercare una shell unix che ti dia operatori logici e molto altro. È possibile ottenere un'implementazione nativa 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
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