Yanıtlar:
Sen yapabilirsin and
iç içe koşullarla:
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
veya:
if %age% geq 2 if %age% leq 12 set class=child
Sen yapabilirsin or
ayrı değişkenle:
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=
veya set res=1
daha sonra kullanabilirsiniz if defined res
.
IF
İfadesi mantıksal operatörler desteklemek (vermez AND
ve OR
basamaklı) IF
ifadeleri örtük bir bağlaç olun.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Varsa File1.Dat
ve File1.Dat
varsa etiketi atlayınFILE12_EXIST_LABEL
.
Ayrıca bakınız: IF /?
De Morgan yasaları , sadece bağlaçları ("VE") ve olumsuzlukları ("DEĞİL") kullanarak, sakatlıkları ("VEYA") mantıksal eşdeğerlere dönüştürmemize izin verir. Bu, diseksiyonları ("VEYA") bir hatta zincirleyebileceğimiz anlamına gelir.
Bu, ad "Yakko" veya "Wakko" veya "Dot" ise, "Warner kardeş veya kız kardeşi" yankısı anlamına gelir.
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
Bu, paxdiablo'nun "OR" örneğinin başka bir sürümüdür, ancak koşullar bir hatta zincirlenir. (Not tam tersi leq
IS gtr
, ve karşıt geq
IS lss
).
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Aşağıdaki örnekler bir AND ifadesinin nasıl yapılacağını gösterir (değişkenleri ayarlamak veya bir komutun parametrelerini eklemek için kullanılır).
Not Defteri'ni başlatmak ve CMD penceresini kapatmak için:
start notepad.exe & exit
'A' değişkeni blah'a eşitse x, y ve z değişkenlerini değerlere ayarlamak için.
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
Umarım yardımcı olur!
VEYA biraz zor, ama aşırı değil. İşte bir örnek
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 (o sırada 16 yaşında), IF ifadelerindeki koşulları ortadan kaldırarak ve daha sonra ELSE yan tümcesini yürütülmesi gereken kodu koymak için konum olarak kullanarak bir OR testinin nasıl uygulanacağı hakkında mantıklı bir fikir verdi. Kendi kendime düşündüm, ancak iki IF deyimi kullanmayı önerdiği için genellikle iki cümle daha gerekli olduğunu ve bu nedenle yürütülen kodun iki kez yazılması gerektiğini düşündüm . Ancak, bir GOTO gerekli kodu atlamak için kullanılırsa, ELSE yan tümcelerini yazmak yerine yürütme kodunun yalnızca bir kez yazılması gerekir .
İşte bir OR oluşturmak için Athul Prakash'ın negatif mantığını nasıl uygulayacağımın test edilebilir bir örneği .
Benim örnekte, bir tankı lisansa sahip eğer birisi bir tank götürmek için izin verilir VEYA askerlik hizmetini yapıyor . İki isteme doğru veya yanlış girin , mantığın bir tankı kullanmanıza izin verip vermediğini görebilirsiniz.
@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
Bir ifadede bir if
+ AND
/ yazmak istiyorsanız, OR
bunlardan hiçbiri yoktur. Ama, yine de grup olabilir if
ile &&
/ ||
ve (
/ )
ifadeleri tek satırda istediğiniz ulaşmak için w / o herhangi bir ek değişkenler ve w / o if-else
blok çoğaltma (tek echo
komut için TRUE
ve FALSE
kod bölümleri):
@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
Çıktı :
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
Hile, type
bırakan / ayarlayan errorlevel
ve böylece bir sonraki komuta giden yolu işleyen komuttadır.
Olumsuzlama işleneni deneyin - 'değil'!
Eğer iç içe 'deyimlerini kullanarak bir if deyiminde' VE 'işlemini gerçekleştirebiliyorsanız (önceki yanıtlara bakın), aynı işlemi' değilse 'ile bir' veya 'işlemi gerçekleştirebilirsiniz.
Henüz bu fikre sahip değilseniz okumaya devam edin. Aksi takdirde, zamanınızı boşa harcamayın ve programlamaya geri dönün.
Tıpkı 'tüm şartlar doğru olduğunda tatmin edilirse' iç içe geçtiği gibi, ancak tüm koşullar yanlış olduğunda tatmin edilemezse iç içe geçer. Bu, 'veya' işlenen ile yapmak istediğinize benzer, değil mi?
Yuvalanmış 'değilse' koşullarından herhangi biri doğru olsa bile, tüm ifade tatminsiz kalır. Bu nedenle, tüm iç içe koşullarınız yanlışsa, koşul ifadesinin gövdesinin yapmak istediğiniz şey olması gerektiğini hatırlayarak ihmal edilmişse 'art arda ise kullanabilirsiniz. Aslında vermek istediğiniz beden, başka bir ifadenin altında olmalıdır.
Ve eğer hala bir şey yapmazsan, üzgünüm, 16 yaşındayım ve açıklamak için yapabileceğim en iyisi bu.
Aşağıdaki kadar kolaydır:
AND> if + if
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
VEYA> 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*
Başka cevaplar olduğunu biliyorum, ama madenin daha basit, anlaşılması daha kolay olduğunu düşünüyorum. Umarım bu size yardımcı olur! ;)
Bir alternatif, size mantıksal işleçler ve çok daha fazlasını veren bir unix kabuğu aramaktır. Bir Bourne bir yerli win32 uygulaması kabuk alabilirsiniz burada cygwin rota gitmek istemiyorsanız. Yerel bir bash burada bulunabilir . Kolayca google zsh veya tcsh gibi diğer iyi alternatifleri google emin olabilirsiniz.
K
Yinelenen tip komutlarını azaltarak Andry'nin cevabında hafif değişiklik:
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