[batch-file] DOS 배치의 논리 연산자 ( “and”, “or”)

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문은 논리 연산자 ( ANDOR)를 지원하지 않으며 계단식 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”)를 한 줄에 연결할 수 있습니다.

이는 이름이 “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”예제의 다른 버전이지만 조건은 한 줄로 연결됩니다. (의 반대는 leqis 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


답변

Athul Prakash (당시 16 세)는 IF 문에서 조건을 무시한 다음 ELSE 절을 실행이 필요한 코드를 넣는 위치로 사용하여 OR 테스트를 구현하는 방법에 대한 논리적 아이디어를 제공했습니다. 나는 그가 두 개의 IF 문을 사용할 것을 제안했기 때문에 보통 두 개의 else 절이 필요하다고 생각했기 때문에 실행 된 코드는 두 번 작성해야합니다 . 그러나 GOTO를 사용하여 필요한 코드를 건너 뛰려면 ELSE 절을 작성하는 대신 실행 코드를 한 번만 작성 하면 됩니다.

다음은 Athul Prakash의 부정 논리를 구현하여 OR 을 만드는 방법에 대한 테스트 가능한 예입니다 .

내 예에서, 누군가 탱크 라이센스가 있거나 병역을하고 있다면 탱크를 운전할 수 있습니다 . 두 프롬프트에서 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


답변

한 문장에 if+ AND/ 를 쓰려면 관심 OR이 없습니다. 그러나 / 및 / 문으로 그룹화 if하여 추가 변수 및 블록 복제 (단일 명령 및 코드 섹션) 없이 한 줄로 원하는 것을 얻을 수 있습니다 .&&||()if-elseechoTRUEFALSE

@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하고 다음 명령으로가는 길을 처리합니다.