Логические операторы ("и", "или") в пакете DOS

Как бы вы реализовали логические операторы в пакетных файлах DOS?

вопрос задан 26.01.2010
JoelFan
18785 репутация

11 ответов


  • 241 рейтинг

    Можно сделать 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
    )
    
    ответ дан paxdiablo, с репутацией 612896, 26.01.2010
  • 59 рейтинг

    Оператор IF не поддерживает логические операторы (AND и OR), каскадные операторы IF создают неявное соединение.

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

    Если File1.Dat и File1.Dat существуют, то перейдите на метку FILE12_EXIST_LABEL.

    См. Также: IF /?

    ответ дан Dave Jarvis, с репутацией 20388, 26.01.2010
  • 45 рейтинг

    Законы Де Моргана позволяют нам преобразовывать дизъюнкции («ИЛИ») в логические эквиваленты, используя только союзы («И») и отрицания («НЕ»). Это означает, что мы можем связать дизъюнкции («ИЛИ») в одну строку

    Это означает, что если имя «Якко» или «Вакко» или «Точка», то эхо «Уорнер брат или сестра».

    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, но условия связаны одной строкой. (Обратите внимание, что противоположность leq - gtr, а противоположность geq - lss. )

    set res=true
    if %hour% gtr 6 if %hour% lss 22 set res=false
    if "%res%"=="true" set state=asleep
    
    ответ дан anomal, с репутацией 1511, 16.05.2012
  • 4 рейтинг

    В следующих примерах показано, как создать оператор AND (используется для установки переменных или включения параметров для команды).

    Чтобы закрыть окно CMD и запустить Блокнот:

    exit & start notepad.exe
    

    Чтобы установить переменные x, y и z в значения, если переменная 'a' равна бла.

    if %a% equ blah set x=1 & set y=2 & set z=3
    

    Надеюсь, что помогает!

    ответ дан GinDiamond, с репутацией 41, 30.11.2011
  • 3 рейтинг

    Также охвачено
    "120} Как использовать операторы AND / OR / XOR / NOT в операторе IF? "
    http: // www. netikka. сеть / tsneti / Информация / tscmd120. HTM

    ИЛИ немного сложнее, но не слишком. Вот пример

    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
    
    ответ дан Timo Salmi, с репутацией 184, 23.07.2012
  • 1 рейтинг

    Попробуйте операнд отрицания - «нет»!

    Что ж, если вы можете выполнить операцию «И» над оператором if, используя вложенные «если» (см. Предыдущие ответы), то вы можете сделать то же самое с «если нет» для выполнения операции «или».

    Если вы еще не поняли идею, читайте дальше. В противном случае, просто не тратьте свое время и вернитесь к программированию.

    Точно так же, как вложенные «если» удовлетворяются только тогда, когда все условия выполняются, вложенные «если нет» выполняются только тогда, когда все условия являются ложными. Это похоже на то, что вы хотите сделать с операндом 'или', не так ли?

    Даже если любое из условий во вложенном «если нет» верно, все утверждение остается неудовлетворенным. Следовательно, вы можете использовать отрицательное «если последовательно», помня, что тело оператора условия должно быть тем, что вы хотите сделать, если все ваши вложенные условия ложны. Тело, которое вы на самом деле хотели дать, должно соответствовать заявлению else.

    И если вы все еще не поняли суть дела, извините, мне 16, и это лучшее, что я могу сделать, чтобы объяснить.

    ответ дан Athul Prakash, с репутацией 19, 22.04.2014
  • 1 рейтинг

    Если вы заинтересованы в том, чтобы написать if + AND/OR в одном утверждении, то его нет. Но вы все равно можете сгруппировать if с операторами &&/|| и (/), чтобы добиться того, что вы хотите в одной строке без каких-либо дополнительных переменных и без дублирования блока 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 и, таким образом, обрабатывает путь к следующей команде.

    ответ дан Andry, с репутацией 422, 22.07.2017
  • 1 рейтинг

    Атул Пракаш (тогда ему было 16 лет) дал логическую идею о том, как реализовать тест ИЛИ, отменив условия в операторах IF, а затем используя предложение ELSE в качестве места для размещения кода, требующего выполнения. Я подумал, что, однако, обычно нужны еще два предложения, поскольку он предлагает использовать два оператора IF, и поэтому исполняемый код необходимо записать дважды . Однако, если GOTO используется для пропуска необходимого кода, вместо написания предложений ELSE код для выполнения должен быть записан только один раз .

    Вот тестируемый пример того, как я бы реализовал негативную логику Атула Пракаша для создания ИЛИ .

    В моем примере кому-то разрешено водить танк, если у него есть лицензия на танк ИЛИ они проходят военную службу Введите 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
    
    ответ дан user3070485, с репутацией 1144, 17.08.2015
  • 1 рейтинг

    Альтернативой является поиск оболочки Unix, которая дает вам логические операторы и многое другое. Вы можете получить собственную win32-реализацию оболочки Bourne здесь , если вы не хотите идти по пути cygwin. Родной Bash можно найти здесь . Я совершенно уверен, что вы можете легко найти другие хорошие альтернативы, такие как zsh или tcsh.

    K

    ответ дан Kevin Shea, с репутацией 774, 26.01.2010
  • 1 рейтинг

    Это так же просто, как следующее:

    И & gt; если + если

    if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
    

    ИЛИ & gt; если // если

    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*
    

    Я знаю, что есть и другие ответы, но я думаю, что шахта более проста, поэтому ее легче понять. Надеюсь, это поможет вам! ;)

    ответ дан Renk Software, с репутацией 84, 22.12.2015
  • -1 рейтинг

    Небольшая модификация ответа Андри, уменьшив дублирующиеся команды типа:

    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
    
    ответ дан TedK, с репутацией 1, 21.09.2017