DOSバッチファイルに論理演算子をどのように実装しますか?
ネストした条件で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
)
IF
ステートメントは論理演算子(AND
とOR
)をサポートしていません。カスケードするIF
ステートメントは暗黙の結合を行います。
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
File1.Dat
とFile1.Dat
が存在する場合は、ラベルFILE12_EXIST_LABEL
にジャンプします。
IF /?
もご覧ください。
De Morganの法則 では、論理積( "AND")と否定( "NOT")のみを使用して、選言( "OR")を論理的に等価なものに変換できます。つまり、選言( "OR")を1行にまとめることができます。
これは、名前が "Yakko"、 "Wakko"、または "Dot"の場合は、 "Warner brother or sister"をエコーすることを意味します。
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
の反対はgtr
であり、geq
の反対はlss
です。)
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
次の例は、ANDステートメントの作成方法を示しています(変数の設定またはコマンドのパラメーターの組み込みに使用されます)。
メモ帳を起動してCMDウィンドウを閉じるには
start notepad.exe & exit
変数 'a'がblahに等しい場合に、変数x、y、およびzを値に設定します。
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
それが役立つことを願っています!
ORはややトリッキーですが、それほど過度ではありません。これが例です
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
否定オペランド - 'not'を試してください。
ネストしたifを使用してif文に対してAND演算を実行できる場合(前の回答を参照)、or演算を実行する場合はif notで同じことができます。
まだアイディアがまだ得られていないのなら、読んでください。それ以外の場合は、単に時間を無駄にせずにプログラミングに戻ってください。
ネストされた 'if'がすべての条件が真の場合にのみ満たされるのと同様に、ネストされた 'if'がすべての条件が偽の場合にのみ満たされる。これは 'or'オペランドを使ってやりたいことと似ていますね。
ネストされた「if not」の条件のいずれか1つが当てはまる場合でも、ステートメント全体は満たされません。したがって、ネストされた条件がすべて偽である場合は、条件ステートメントの本体を自分のやりたいものにする必要があることを忘れないでください。あなたが実際に与えたかった体はelse文の下に来るべきです。
それでもあなたがそのことの根拠を得られないのであれば、すみません、私は16歳です。
1つのステートメントにif
+ AND
/OR
を記述することに興味がある場合は、何もありません。ただし、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
をドロップ/設定し、次のコマンドへの道を処理します。
Athul Prakash(当時16歳)は、IFステートメントの条件を無効にしてから実行が必要なコードを配置する場所としてELSE句を使用することによってORテストを実装する方法について論理的なアイデアを出しました。私は自分自身に2つのIFステートメントを使うことを提案しているので通常必要とされる他の2つの節があると思い、実行されたコードは times と書く必要があります。ただし、GOTOを使用して必要なコードをスキップしてスキップする場合は、ELSE句を記述するのではなく、実行用のコードを once と記述するだけで済みます。
またはを作成するためにAthul Prakashの否定的なロジックを実装する方法のテスト可能な例を示します。
私の例では、彼らが戦車免許を持っていれば誰かが戦車を運転することを許されていますOR彼らは彼らの軍事任務を行っています。 2つのプロンプトで true または false と入力すると、ロジックでタンクを運転できるかどうかを確認できます。
@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
それは以下と同じくらい簡単です:
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を使いたくないのであれば、ネイティブのwin32によるBourne Shellの実装 をここから入手できます 。ここでネイティブのbashが見つかります。私はzshやtcshのような他の良い代替品を簡単にグーグルできると確信しています。
K