Câu trả lời:
Bạn có thể làm and
với điều kiện lồng nhau:
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
hoặc là:
if %age% geq 2 if %age% leq 12 set class=child
Bạn có thể làm or
với một biến riêng biệt:
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=
hoặc set res=1
sau if defined res
đó mạnh hơn một chút so với lỗi chính tả và hoạt động ngay cả trong các khối mà không cho phép mở rộng chậm trễ.
Câu IF
lệnh không hỗ trợ các toán tử logic ( AND
và OR
), các IF
câu lệnh xếp tầng tạo thành một kết hợp ngầm.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Nếu File1.Dat
và File1.Dat
tồn tại thì nhảy nhãn FILE12_EXIST_LABEL
.
Xem thêm: IF /?
Luật của De Morgan cho phép chúng tôi chuyển đổi các bất đồng ("HOẶC") thành các tương đương logic bằng cách chỉ sử dụng các liên từ ("VÀ") và phủ định ("KHÔNG"). Điều này có nghĩa là chúng ta có thể xâu chuỗi các bất đồng ("HOẶC") trên một dòng.
Điều này có nghĩa là nếu tên là "Yakko" hoặc "Wakko" hoặc "Dot", sau đó lặp lại "Anh chị em 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
Đây là một phiên bản khác của ví dụ "HOẶC" của paxdiablo, nhưng các điều kiện được nối vào một dòng. (Lưu ý rằng điều ngược lại leq
là gtr
và ngược lại geq
là lss
.)
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Các ví dụ sau đây cho thấy cách tạo câu lệnh AND (được sử dụng để đặt biến hoặc bao gồm các tham số cho lệnh).
Để bắt đầu Notepad và đóng cửa sổ CMD:
start notepad.exe & exit
Để đặt các biến x, y và z thành các giá trị nếu biến 'a' bằng blah.
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
Mong rằng sẽ giúp!
HOẶC hơi khó, nhưng không quá. Đây là một ví dụ
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 tuổi vào thời điểm đó) đã đưa ra một ý tưởng hợp lý về cách thực hiện kiểm tra OR bằng cách phủ định các điều kiện trong các câu lệnh IF và sau đó sử dụng mệnh đề ELSE làm vị trí để đặt mã yêu cầu thực thi. Tôi tự nghĩ rằng có hai mệnh đề khác thường cần thiết vì anh ta đề nghị sử dụng hai câu lệnh IF và do đó, mã thực thi cần phải được viết hai lần . Tuy nhiên, nếu một GOTO được sử dụng để bỏ qua mã được yêu cầu, thay vì viết ELSE, mệnh đề thực thi chỉ cần được viết một lần .
Dưới đây là một ví dụ có thể kiểm chứng về cách tôi sẽ triển khai logic phủ định của Athul Prakash để tạo OR .
Trong ví dụ của tôi, ai đó được phép lái xe tăng nếu họ có bằng lái xe tăng HOẶC họ đang thực hiện nghĩa vụ quân sự . Nhập đúng hoặc sai theo hai lời nhắc và bạn sẽ có thể xem liệu logic có cho phép bạn lái xe tăng hay không.
@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
Nếu bạn quan tâm để viết một câu lệnh if
+ AND
/ OR
trong một, thì không có câu nào trong số đó. Tuy nhiên, bạn vẫn có thể nhóm if
với &&
/ ||
và (
/ các )
câu lệnh để đạt được điều bạn muốn trong một dòng với bất kỳ biến bổ sung nào và if-else
sao chép khối w / o ( echo
lệnh đơn TRUE
và FALSE
phần mã):
@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
Đầu ra :
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
Thủ thuật là trong type
lệnh thả / thiết lập errorlevel
và do đó xử lý đường đến lệnh tiếp theo.
Hãy thử toán hạng phủ định - 'không'!
Chà, nếu bạn có thể thực hiện thao tác 'VÀ' trên câu lệnh if bằng cách sử dụng 'if lồng nhau (tham khảo các câu trả lời trước), thì bạn có thể làm điều tương tự với' nếu không 'để thực hiện thao tác' hoặc '.
Nếu bạn chưa có ý tưởng nào, hãy đọc tiếp. Nếu không, đừng lãng phí thời gian của bạn và quay lại lập trình.
Cũng như lồng nhau 'nếu chỉ được thỏa mãn khi tất cả các điều kiện là đúng, lồng nhau' nếu không được thỏa mãn chỉ khi tất cả các điều kiện là sai. Điều này tương tự với những gì bạn muốn làm với toán hạng 'hoặc', phải không?
Ngay cả khi bất kỳ một trong những điều kiện trong 'nếu không' được lồng nhau là đúng, toàn bộ tuyên bố vẫn không thỏa mãn. Do đó, bạn có thể sử dụng phủ định 'nếu liên tiếp bằng cách nhớ rằng phần thân của câu lệnh điều kiện sẽ là những gì bạn muốn làm nếu tất cả các điều kiện lồng nhau của bạn là sai. Cơ thể mà bạn thực sự muốn cho nên đến theo tuyên bố khác.
Và nếu bạn vẫn không hiểu ý chính, xin lỗi, tôi 16 tuổi và đó là điều tốt nhất tôi có thể làm để giải thích.
Nó chỉ dễ dàng như sau:
VÀ> nếu + nếu
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
HOẶC> nếu // nếu
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*
Tôi biết rằng có những câu trả lời khác, nhưng tôi nghĩ rằng cái này đơn giản hơn, nên dễ hiểu hơn. Hy vọng điều này sẽ giúp bạn! ;)
Một cách khác là tìm kiếm một vỏ unix cung cấp cho bạn các toán tử logic và nhiều thứ khác. Bạn có thể nhận bản triển khai win32 riêng của trình bao Bourne tại đây nếu bạn không muốn đi theo lộ trình cygwin. Một bash bản địa có thể được tìm thấy ở đây . Tôi khá chắc chắn rằng bạn có thể dễ dàng google các lựa chọn thay thế tốt khác như zsh hoặc tcsh.
K
Sửa đổi nhẹ cho câu trả lời của Andry, giảm các lệnh loại trùng lặp:
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