web-dev-qa-db-ja.com

DOSバッチでの論理演算子( "and"、 "or")

DOSバッチファイルに論理演算子をどのように実装しますか?

230
JoelFan

ネストした条件で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
)
267
paxdiablo

IFステートメントは論理演算子(ANDOR)をサポートしていません。カスケードするIFステートメントは暗黙の結合を行います。

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL

File1.DatFile1.Datが存在する場合は、ラベルFILE12_EXIST_LABELにジャンプします。

IF /? もご覧ください。

65
Dave Jarvis

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
50
anomal

次の例は、ANDステートメントの作成方法を示しています(変数の設定またはコマンドのパラメーターの組み込みに使用されます)。

メモ帳を起動してCMDウィンドウを閉じるには

start notepad.exe & exit

変数 'a'がblahに等しい場合に、変数x、y、およびzを値に設定します。

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

それが役立つことを願っています!

5
GinDiamond

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
4
Timo Salmi

否定オペランド - 'not'を試してください。

ネストしたifを使用してif文に対してAND演算を実行できる場合(前の回答を参照)、or演算を実行する場合はif notで同じことができます。

まだアイディアがまだ得られていないのなら、読んでください。それ以外の場合は、単に時間を無駄にせずにプログラミングに戻ってください。

ネストされた 'if'がすべての条件が真の場合にのみ満たされるのと同様に、ネストされた 'if'がすべての条件が偽の場合にのみ満たされる。これは 'or'オペランドを使ってやりたいことと似ていますね。

ネストされた「if not」の条件のいずれか1つが当てはまる場合でも、ステートメント全体は満たされません。したがって、ネストされた条件がすべて偽である場合は、条件ステートメントの本体を自分のやりたいものにする必要があることを忘れないでください。あなたが実際に与えたかった体はelse文の下に来るべきです。

それでもあなたがそのことの根拠を得られないのであれば、すみません、私は16歳です。

1
Athul Prakash

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をドロップ/設定し、次のコマンドへの道を処理します。

1
Andry

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
1
user3070485

それは以下と同じくらい簡単です:

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*

他にも答えがあることを私は知っていますが、私は私のものがより単純で理解しやすいようにもっと思っています。これがお役に立てば幸いです。 ;)

1
Renk Software

別の方法はあなたに論理演算子ともっとたくさんのものを与えるUNIXシェルを探すことです。 cygwinを使いたくないのであれば、ネイティブのwin32によるBourne Shellの実装 をここから入手できます 。ここでネイティブのbashが見つかります。私はzshやtcshのような他の良い代替品を簡単にグーグルできると確信しています。

K

0
Kevin Shea