[windows] IF… 또는 IF… Windows 배치 파일에서

Windows 배치 파일에 IF OR IF 조건문을 작성하는 방법이 있습니까?

예를 들면 :

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE



답변

zmbq 솔루션은 좋지만 FOR DO (…) 루프와 같은 코드 블록 내부와 같은 모든 상황에서 사용할 수는 없습니다.

대안은 인디케이터 변수를 사용하는 것입니다. 정의되지 않도록 초기화 한 다음 OR 조건 중 하나가 참인 경우에만 정의하십시오. 그런 다음 IF DEFINED를 최종 테스트로 사용합니다. 지연된 확장을 사용할 필요가 없습니다.

FOR ..... DO (
  set "TRUE="
  IF cond1 set TRUE=1
  IF cond2 set TRUE=1
  IF defined TRUE (
    ...
  ) else (
    ...
  )
)

arasmussen이 첫 번째 조건이 참이면 조금 더 빨리 수행 할 수 있다는 이유로 사용하는 ELSE IF 논리를 추가 할 수 있지만, 저는 결코 신경 쓰지 않습니다.

부록 -IF 문에서 OR 사용 WinXP 배치 스크립트 와 거의 동일한 답변이있는 중복 질문입니다.

최종 부록 -변수가 대소 문자를 구분하지 않는 값 목록 중 하나인지 테스트하는 데 가장 좋아하는 기술을 거의 잊었습니다. 구분 된 허용 값 목록을 포함하는 테스트 변수를 초기화 한 다음 검색 및 바꾸기를 사용하여 변수가 목록 내에 있는지 테스트합니다. 이것은 매우 빠르고 임의로 긴 목록에 최소한의 코드를 사용합니다. 지연된 확장이 필요합니다 (또는 CALL %% VAR %% 트릭). 또한 테스트는 케이스에 민감하지 않습니다.

set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)

위의 내용은 VAR에이 포함되어 있으면 실패 할 수 =있으므로 테스트는 절대 불가능합니다.

VAR의 현재 값에 액세스하기 위해 지연된 확장이 필요한 블록 내에서 테스트를 수행하는 경우

for ... do (
  set "TEST=;val1;val2;val3;val4;val5;"
  for /f %%A in (";!VAR!;") do if "!TEST:%%A=!" neq "!TEST!" (echo true) else (echo false)
)

VAR 내의 예상 값에 따라 “delims =”와 같은 FOR 옵션이 필요할 수 있습니다.

위의 전략은 =코드를 조금 더 추가하여 VAR 에서도 안정적으로 만들 수 있습니다 .

set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true

그러나 이제 우리는 표시기 변수를 추가하지 않는 한 ELSE 절을 제공하는 능력을 잃었습니다. 코드가 약간 “보기 흉하게”보이기 시작했지만 VAR이 임의의 수의 대소 문자를 구분하지 않는 옵션 중 하나인지 테스트하는 데 가장 신뢰할 수있는 방법이라고 생각합니다.

마지막으로 각 값에 대해 하나의 IF를 수행해야하기 때문에 약간 느리다고 생각하는 더 간단한 버전이 있습니다. Aacini는 이전에 언급 된 링크에서 수락 된 답변에 대한 의견으로이 솔루션을 제공했습니다.

for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A echo true

값 목록에는 * 또는? 문자 및 값과 %VAR%따옴표를 포함해서는 안됩니다. (가) 경우 따옴표 문제가 발생할 %VAR%또한 공백이나 같은 특수 문자가 포함되어 ^, &이 솔루션은 표시기 변수를 추가하지 않는 한이 ELSE 절에 대한 옵션을 제공하지 않습니다이다와 등 또 다른 한계를. 장점은 IF /I옵션의 유무에 따라 대소 문자를 구분하거나 구분하지 않을 수 있다는 것입니다.


답변

나는 그렇게 생각하지 않는다. 두 개의 IF 및 GOTO를 동일한 레이블로 사용하십시오.

IF cond1 GOTO foundit
IF cond2 GOTO foundit

ECHO Didn't found it
GOTO end

:foundit
ECHO Found it!

:end


답변

이 게시물에 감사드립니다. 많은 도움이되었습니다.

도움이 될 수 있다면 Dunno는 문제가 있었으며 덕분 에이 부울 등가를 기반으로 해결하는 또 다른 방법이라고 생각하는 것을 발견했습니다.

“A 또는 B”는 “not (A 아님 B 아님)”과 동일합니다.

그러므로:

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE

된다 :

IF not [%var%] == [1] IF not [%var%] == [2] ECHO FALSE


답변

간단한 “FOR”을 한 줄에 사용하여 “or”조건을 사용할 수 있습니다.

FOR %%a in (item1 item2 ...) DO IF {condition_involving_%%a} {execute_command}

귀하의 사례에 적용 :

FOR %%a in (1 2) DO IF %var%==%%a ECHO TRUE


답변

이 질문이 조금 더 오래된 경우에도 :

사용하고 싶다면 if cond1 or cond 2-복잡한 루프 나 그런 것들을 사용해서는 안됩니다.

단순함 ifs과 결합 된 후 둘 다 제공 goto하는 것은 암시 적 또는입니다.

//thats an implicit IF cond1 OR cond2 OR cond3
if cond1 GOTO doit
if cond2 GOTO doit
if cond3 GOTO doit

//thats our else.
GOTO end

:doit
  echo "doing it"

:end

goto없이 “inplace”작업이 없으면 모든 조건이 일치하면 작업을 3 번 실행할 수 있습니다.


답변

더 없다 IF <arg> OR거나 ELIF또는 ELSE IF그러나, 배치에 …

이전 IF의 ELSE 안에 다른 IF를 중첩 해보십시오.

IF <arg> (
    ....
) ELSE (
    IF <arg> (
        ......
    ) ELSE (
        IF <arg> (
            ....
        ) ELSE (
    )
)


답변

OR 논리를 평가하고 단일 값을 반환하는 함수를 사용할 수 있습니다.

@echo off
set var1=3
set var2=5
call :logic_or orResult "'%var1%'=='4'" "'%var2%'=='5'"
if %orResult%==1 (
    echo At least one expression is true
) ELSE echo All expressions are false
exit /b

:logic_or <resultVar> expression1 [[expr2] ... expr-n]
SETLOCAL
set "logic_or.result=0"
set "logic_or.resultVar=%~1"

:logic_or_loop
if "%~2"=="" goto :logic_or_end
if %~2 set "logic_or.result=1"
SHIFT
goto :logic_or_loop

:logic_or_end
(
  ENDLOCAL
  set "%logic_or.resultVar%=%logic_or.result%"
  exit /b
)