回答:
and
ネストされた条件で行うことができます:
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
または:
if %age% geq 2 if %age% leq 12 set class=child
or
別の変数で行うことができます:
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=
またはset res=1
を使用することもできます。その後if defined res
、タイプミスに対してもう少し堅牢であり、遅延拡張を明示的に有効にせずにブロックでも機能します。
ドモルガンの法則により、論理積( "OR")を論理積( "AND")と否定( "NOT")のみを使用して論理的に等価に変換できます。つまり、論理和( "OR")を1行につなげることができます。
これは、名前が「やっこ」、「わっこ」、「ドット」の場合、「ワーナーの兄弟または姉妹」をエコーします。
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
これはpaxdiabloの「OR」の例の別のバージョンですが、条件は1行にチェーンされています。(注その反対leq
IS gtr
との対向geq
IS lss
)。
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Athul Prakash(当時16歳)は、IFステートメントの条件を否定し、ELSE句を場所として使用して、実行が必要なコードを配置することにより、ORテストを実装する方法について論理的なアイデアを提供しました。しかし、彼は2つのIFステートメントの使用を提案しているため、通常は2つのelse句が必要であり、実行されるコードを2回記述する必要があると思いました。ただし、GOTOを使用して必要なコードをスキップする場合は、ELSE句を記述する代わりに、実行用のコードを1回記述するだけで済みます。
以下は、Athul Prakashの否定論理を実装してORを作成する方法のテスト可能な例です。
私の例では、誰かが戦車免許を持っているか、兵役をしている場合、誰かが戦車を運転することを許可されています。入力真または偽の2つのプロンプトに、あなたは、ロジックは、あなたがタンクを駆動することを可能にするかどうかを確認することができます。
@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
あなたが書くことに興味がある場合はif
+ AND
/をOR
1つのステートメントで、その後何の任意のそれのはありません。ただし、/ および/ ステートメントでグループ化if
して、追加の変数を使用せず、ブロックを複製せずに1行で実行することもできます(単一のコマンドとコードセクション)。&&
||
(
)
if-else
echo
TRUE
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
出力:
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
トリックは、type
をドロップ/設定errorlevel
し、次のコマンドへの道を処理するコマンドにあります。
否定オペランドを試してください-「しない」!
ネストされた「if」を使用してifステートメントで「AND」演算を実行できる場合(前の回答を参照)、「if not」で同じことを実行して「or」演算を実行できます。
まだアイデアがわからない場合は、読み進めてください。それ以外の場合は、時間を無駄にせずにプログラミングに戻ってください。
すべての条件がtrueの場合にのみネストされた「if」が満たされるのと同じように、すべての条件がfalseの場合にのみネストされた「if not」が満たされます。これは、「または」オペランドを使用して実行する処理に似ていますね。
ネストされた「if not」の条件のいずれかが真であっても、ステートメント全体が満たされないままです。したがって、ネストされたすべての条件がfalseの場合に条件ステートメントの本文を実行する必要があることを覚えておくことで、否定の「if」を続けて使用できます。あなたが実際に与えたかった体は、elseステートメントの下にあるはずです。
それでもまだその要点がわからない場合は、申し訳ありませんが、私は16歳です。それが、私が説明できる最善の方法です。
次のように簡単です。
AND> if + if
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
OR> 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*
他にも答えはあると思いますが、鉱山の方がシンプルなので理解しやすいと思います。これがお役に立てば幸いです!;)
別の方法は、論理演算子やその他多くの機能を提供するUNIXシェルを探すことです。cygwinルートを使いたくない場合は、ここで Bourneシェルのネイティブwin32実装を取得できます。ネイティブbashはここにあります。zshやtcshなど、他の優れた代替手段を簡単にググることができると私は確信しています。
K
Andryの答えを少し変更して、重複するtypeコマンドを減らします。
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