Odpowiedzi:
Możesz to zrobić and
w warunkach zagnieżdżonych:
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
lub:
if %age% geq 2 if %age% leq 12 set class=child
Możesz to zrobić or
za pomocą oddzielnej zmiennej:
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=
lub set res=1
, a następnie if defined res
, który jest nieco bardziej odporne na literówki i działa nawet w blokach bez wyraźnego umożliwiający opóźnione ekspansji.
IF
Oświadczenie nie obsługuje operatorów logicznych ( AND
i OR
), kaskadowy IF
oświadczenia zrobić niejawny koniunkcji.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Jeśli File1.Dat
i File1.Dat
istnieje, przeskocz etykietę FILE12_EXIST_LABEL
.
Zobacz też: IF /?
Prawa De Morgana pozwalają nam przekształcać rozłączenia („LUB”) w logiczne odpowiedniki, używając tylko spójników („ORAZ”) i negacji („NIE”). Oznacza to, że możemy połączyć rozłączenia („OR”) w jedną linię.
Oznacza to, że jeśli nazywa się „Yakko”, „Wakko” lub „Dot”, wówczas należy użyć echa „brat lub siostra Warner”.
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
Jest to kolejna wersja przykładu „LUB” paxdiablo, ale warunki są powiązane w jedną linię. (Zauważ, że przeciwieństwo leq
jest gtr
, a przeciwieństwo geq
jest lss
.)
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Poniższe przykłady pokazują, jak utworzyć instrukcję AND (używaną do ustawiania zmiennych lub włączania parametrów dla polecenia).
Aby uruchomić Notatnik i zamknąć okno CMD:
start notepad.exe & exit
Aby ustawić zmienne x, y i z na wartości, jeśli zmienna „a” jest równa bla.
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
Mam nadzieję, że to pomaga!
OR jest nieco trudny, ale nie przesadnie. Oto przykład
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 (wówczas 16 lat) dał logiczny pomysł, jak zaimplementować test OR, negując warunki w instrukcjach IF, a następnie używając klauzuli ELSE jako lokalizacji do umieszczenia kodu wymagającego wykonania. Pomyślałem sobie, że zwykle potrzebne są jednak jeszcze dwie klauzule, ponieważ sugeruje on użycie dwóch instrukcji IF, a zatem wykonany kod musi zostać napisany dwukrotnie . Jeśli jednak GOTO zostanie użyte do pominięcia wymaganego kodu, zamiast pisać klauzule ELSE, kod do wykonania musi zostać napisany tylko raz .
Oto sprawdzalny przykład tego, jak zaimplementowałbym negatywną logikę Athul Prakash, aby stworzyć OR .
W moim przykładzie ktoś może prowadzić czołg, jeśli ma licencję na czołg LUB LUB wykonuje swoją służbę wojskową . Wpisz true lub false po dwóch pytaniach, a będziesz mógł zobaczyć, czy logika pozwala prowadzić czołg.
@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
Jeśli chcesz napisać znak if
+ AND
/ OR
w jednej instrukcji, nie ma żadnej z nich. Ale nadal można grupa if
z &&
/ ||
a (
/ )
oświadczenia do osiągnięcia tego, co chcesz w jednej linii w / o dodatkowe zmienne i w / o if-else
powielania bloku (pojedynczego echo
dowodzenia TRUE
i FALSE
sekcji Code):
@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
Wyjście :
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
Trik jest w type
poleceniu, które upuszcza / ustawia, errorlevel
a więc obsługuje drogę do następnego polecenia.
Spróbuj operand negacji - „nie”!
Cóż, jeśli możesz wykonać operację „ORAZ” na instrukcji if za pomocą zagnieżdżonej instrukcji „jeśli” (zapoznaj się z poprzednimi odpowiedziami), możesz zrobić to samo z operacją „jeśli nie”, aby wykonać operację „lub”.
Jeśli jeszcze nie masz pomysłu, czytaj dalej. W przeciwnym razie nie marnuj czasu i wróć do programowania.
Podobnie jak zagnieżdżone „jeśli są spełnione tylko wtedy, gdy wszystkie warunki są spełnione, tak samo zagnieżdżone”, jeśli nie są spełnione tylko wtedy, gdy wszystkie warunki są fałszywe. Jest to podobne do tego, co chcesz zrobić z operandem „lub”, prawda?
Nawet jeśli którykolwiek z warunków w zagnieżdżonym „jeśli nie” jest prawdziwy, całe stwierdzenie pozostaje niespełnione. Dlatego można użyć negacji „jeśli następują kolejno po sobie, pamiętając, że treść instrukcji warunku powinna być tym, co chcesz zrobić, jeśli wszystkie zagnieżdżone warunki są fałszywe. Ciało, które naprawdę chciałeś dać, powinno znaleźć się pod stwierdzeniem else.
A jeśli nadal nie dostałeś tego wszystkiego, przepraszam, mam 16 lat i to najlepsze, co mogę zrobić, aby to wyjaśnić.
Jest to tak proste, jak następujące:
AND> if + if
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
LUB> 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*
Wiem, że istnieją inne odpowiedzi, ale myślę, że kopalnia jest prostsza, więc łatwiejsza do zrozumienia. Mam nadzieję, że to ci pomoże! ;)
Alternatywą jest poszukiwanie powłoki uniksowej, która daje operatorom logicznym i wiele więcej. Można uzyskać natywna implementacja win32 z Bourne shell tutaj jeśli nie chcesz iść cygwin trasą. Native bash można znaleźć tutaj . Jestem pewien, że możesz łatwo znaleźć w Google inne dobre alternatywy, takie jak zsh lub tcsh.
K.
Niewielka modyfikacja odpowiedzi Andry'ego, zmniejszająca liczbę poleceń typu duplikat:
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