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
)