[batch-file] Operatori logici ("e", "o") in batch DOS


4 Answers

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 /?

Question

Come implementeresti gli operatori logici nei file batch di DOS?




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.




Prova l'operazione di negazione - "non"!

Bene, se è possibile 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



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!






Related