배치 파일에서 if-else 구조를 사용하는 방법은 무엇입니까?


136

배치 파일의 if-else 구조에 대한 질문이 있습니다. 각 명령은 개별적으로 실행되지만 "if-else"블록을 안전하게 사용할 수 없으므로 프로그램의이 부분이 작동하지 않습니다. 이 부품들을 어떻게 작동시킬 수 있습니까? 감사합니다.

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )
ELSE IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

ELSE IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )
ELSE IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

내 질문을 명확하게 읽습니까? 나는 그것을 한 줄씩 읽었지만 나에게 나란히 보인다.
시조

4
안녕하세요, 스택 오버플로에 오신 것을 환영합니다! 코드 블록을 만들려면 관련 텍스트를 강조 표시하고 {}버튼을 클릭하십시오 . 게시물을 더 읽기 쉽게 만들고 마크 업과 관련된 일부 문제를 방지합니다. 귀하의 질문에 대한 답변으로 이제 가능합니다! 질문을 작성할 때 아래에 미리보기가 표시되어 게시 된 모습을 확인할 수 있습니다.
Ben

1
설명해 주셔서 감사합니다. 이 방법을 사용하겠습니다.
시조

답변:


110

구문이 잘못되었습니다. 을 사용할 수 없습니다 ELSE IF. 어쨌든 실제로는 필요하지 않은 것 같습니다. 여러 IF문장을 사용하십시오 .

IF %F%==1 IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

IF %F%==1 IF %C%==0 (
    ::moving the file c to d
    move "%sourceFile%" "%destinationFile%"
    )

IF %F%==0 IF %C%==1 (
    ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
    xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
    )

IF %F%==0 IF %C%==0 (
    ::moving a directory
    xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
    rd /s /q "%sourceMoveDirectory%"
    )

훌륭한 배치 파일 참조 : http://ss64.com/nt/if.html


2
내가 틀렸다면 나를 수정하십시오.하지만 &&여러 if조건 에서 사용할 수 있다고 생각하지 않습니다. 대체 구문을 참조하십시오.
발리 C

if 조건이 다음과 같은 경우 : "IF % F % == 0"안전하게 실행되지만 && 추가하면 실행되지 않습니다. if에서 두 가지 조건을 어떻게 사용할 수 있습니까?
시조

1
@aprogrammer, 내 예를보십시오. 여러 조건이있는 경우IF condition1 IF condition 2
James Hill

나는 당신의 대답을 시도했지만 그것을 실행할 수 없었지만 다시 시도하고 실행되는 코드 개미로 수정했습니다. 내 코드 일부의 마지막 상황은 다음과 같습니다. IF % F % == 1 IF % C % == 1 (:: c 파일을 복사하여 "% sourceFile %" "% destinationFile %"복사) ELSE (IF % F % == 1 IF % C % == 0 (:: 파일 c를 d로 이동하여 "% sourceFile %" "% destinationFile %")) ELSE (IF % F % == 0 IF % C % == 1 (:: d에서 디렉토리 c 복사, / s : boş olanlar hariç, / e : boş olanlar dahil xcopy "% sourceCopyDirectory %" "% destinationCopyDirectory %"/ s / e))
시조

4
사용할 수 없다는 것은 무엇을 의미 ELSE IF합니까? Win7에서 제대로 작동합니다. 예를보십시오 : paste2.org/G8tMae92
bryc

56

나는 DOS 에서이 의사 코드의 의미에 대해 약간의 혼란이 있다고 생각합니다 .IF A IF BX ELSE Y. IF (A 및 B) THEN X ELSE Y를 의미하지는 않지만 사실은 IF A (IF B THEN X ELSE Y)를 의미합니다. A 테스트에 실패하면 내부 if-else 전체가 무시됩니다.

언급 된 답변 중 하나로서,이 경우 테스트 중 하나만 성공할 수 있으므로 'else'는 필요하지 않지만 물론이 예제에서만 작동하는 경우 if-else를 수행하는 일반적인 솔루션은 아닙니다.

이 문제에는 여러 가지 방법이 있습니다. 여기 몇 가지 아이디어가 있습니다. 모두 추악하지만 이건 DOS입니다!

@echo off

set one=1
set two=2

REM Example 1

IF %one%_%two%==1_1 (
   echo Example 1 fails
) ELSE IF %one%_%two%==1_2 (
   echo Example 1 works correctly
) ELSE (
    echo Example 1 fails
)

REM Example 2

set test1result=0
set test2result=0

if %one%==1 if %two%==1 set test1result=1
if %one%==1 if %two%==2 set test2result=1

IF %test1result%==1 (
   echo Example 2 fails
) ELSE IF %test2result%==1 (
   echo Example 2 works correctly
) ELSE (
    echo Example 2 fails
)

REM Example 3

if %one%==1 if %two%==1 (
   echo Example 3 fails
   goto :endoftests
)
if %one%==1 if %two%==2 (
   echo Example 3 works correctly
   goto :endoftests
)
echo Example 3 fails
)
:endoftests

처음 두 개 set는 퍼센트 기호가 필요하지 않다고 생각합니다 . 해야set one=1
제프

13

AFAIK if else는 다른 언어 에서처럼 일괄 처리를 수행 할 수 없으며 중첩되어야 if합니다.

중첩을 사용하면 if배치가 다음과 같이 보입니다.

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    ) ELSE (
        IF %F%==1 IF %C%==0(
        ::moving the file c to d
        move "%sourceFile%" "%destinationFile%"
        ) ELSE (
            IF %F%==0 IF %C%==1(
            ::copying a directory c from d, /s:  boş olanlar hariç, /e:boş olanlar dahil
            xcopy "%sourceCopyDirectory%" "%destinationCopyDirectory%" /s/e
            ) ELSE (
                IF %F%==0 IF %C%==0(
                ::moving a directory
                xcopy /E "%sourceMoveDirectory%" "%destinationMoveDirectory%"
                rd /s /q "%sourceMoveDirectory%"
                )
            )
        )
    )

또는 James가 제안한 것처럼 체인을 연결 if하지만 올바른 구문은

IF %F%==1 IF %C%==1(
    ::copying the file c to d
    copy "%sourceFile%" "%destinationFile%"
    )

1
if else특히 C와 같은 언어에서는 중첩 if도 있습니다. 배치 파일에 블록으로 중첩 할 필요가 없습니다.
Joey

@Joey 나는 잘 따르지 않는다. else if콤보가 중첩되어 있다는 것을 알고 if있지만 C 언어 에서처럼 키워드를 일괄 적으로 사용할 수 있다고 생각하지 않았습니다.
발리 C

흠, 난 여전히 일에 얻을 수 없다,하지만 난 그것을 위해 당신의 말을거야, 당신은 내가 :) 긴 버전으로이 답변을 떠날거야 무슨 얘기 알
발리 C

귀하의 답변에 감사드립니다. 그러나 아무도 내 코드에서 실행되지 않았습니다.
시위

다른 예 : 1 == 1 (에코 1) 인 경우 (1 == 1 (에코 2) 인 경우 (에코 3) 인 경우)
JohnP2

1

나는 당신이 같은 것을 사용할 수 있다고 생각합니다

if ___ (

do this

) else if ___ (

do this

)

27
두 번째 조건의 진술이 "그렇게"되어야하지 않습니까?
bvj

7
@bvj 아니, 아니, 다 잘못 했어. 그것은해야 do foo하고 do bar.
yyny

당신이 쓸 때 IF (test) (command) ELSE IF (test) (command), 당신은 암시하고 IF (test) (command) ELSE (IF (test) (command))있습니다. 이것은 때때로 작동하지만 DOS에서 허용되는 실제 프로그래밍 구조라고 생각되면 PITA가 실패 할 때 문제를 해결해야합니다.
Tim

1

if-then-else 구조를 유지하기 위해 "완료"매개 변수를 추가하고 싶기 때문에 복잡한 if-condition에는 약간 늦었고 여전히 유용합니다.

set done=0
if %F%==1 if %C%==0 (set done=1 & echo found F=1 and C=0: %F% + %C%)
if %F%==2 if %C%==0 (set done=1 & echo found F=2 and C=0: %F% + %C%)
if %F%==3 if %C%==0 (set done=1 & echo found F=3 and C=0: %F% + %C%)
if %done%==0 (echo do something)

0

IF...ELSE IF 구조는 배치 파일에서 특히 잘 작동합니다. 특히 각 IF 행에 하나의 조건식 만 사용하는 경우 :

IF %F%==1 (
    ::copying the file c to d
    copy "%sourceFile%1" "%destinationFile1%"
) ELSE IF %F%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%" )

귀하의 예 IF...AND...IF에서는 두 가지 조건을 동시에 충족 해야하는 유형 구문 을 사용 합니다. 이 경우에도 여전히 IF...ELSE IF구문을 사용할 수 있지만 다음 ELSE 조건에 대한 불확실성을 피하기 위해 추가 괄호를 사용할 수 있습니다 .

IF %F%==1 (IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%" )
) ELSE IF %F%==1 (IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

위의 구성은 다음과 같습니다.

IF %F%==1 (
    IF %C%==1 (
    ::copying the file c to d
    copy "%sourceFile1%" "%destinationFile1%"
    ) ELSE IF %C%==0 (
    ::moving the file e to f
    move "%sourceFile2%" "%destinationFile2%"))

배치 명령의 처리 순서는 CMD.exe 구문 분석 순서 에 따라 다릅니다 . 구성이 논리적 순서를 따르는 지 확인하고 원칙적으로 작동합니다. 배치 스크립트가 오류없이 Cmd.exe에 의해 처리되면 이는 누군가가 달리 말했더라도 이것이 올바른 (즉, OS Cmd.exe 버전에서 지원되는) 구문임을 의미합니다.


0

여기에 내 코드 예제 if..else..if위한거야
다음을 수행하는

프로세스 이름을 묻는 메시지 표시

프로세스 이름이 유효하지 않으면
사용자에게 쓴다

Error : The Processor above doesn't seem to be exist 

프로세스 이름이 서비스 인 경우
사용자에게 쓰기

Error : You can't kill the Processor above 

프로세스 이름이 유효 하고 서비스가 아닌 경우
사용자에게 작성

과정을 통해 살해되었습니다taskill

그래서 나는 그것을 killer.bat 프로세스 라고 불렀습니다
. 내 코드는 다음과 같습니다.

@echo off

:Start
Rem preparing the batch  
cls
Title Processor Killer
Color 0B
Echo Type Processor name to kill It (Without ".exe")
set /p ProcessorTokill=%=%  

:tasklist
tasklist|find /i "%ProcessorTokill%.exe">nul & if errorlevel 1 (
REM check if the process name is invalid 
Cls 
Title %ProcessorTokill% Not Found
Color 0A
echo %ProcessorTokill%
echo Error : The Processor above doesn't seem to be exist    

) else if %ProcessorTokill%==services (
REM check if the process name is services and doesn't kill it
Cls 
Color 0c
Title Permission denied 
echo "%ProcessorTokill%.exe"
echo Error : You can't kill the Processor above 

) else (
REM if the process name is valid and not services
Cls 
Title %ProcessorTokill% Found
Color 0e
echo %ProcessorTokill% Found
ping localhost -n 2 -w 1000>nul
echo Killing %ProcessorTokill% ...
taskkill /f /im %ProcessorTokill%.exe /t>nul
echo %ProcessorTokill% Killed...
)

pause>nul



REM If else if Template
REM if thing1 (
REM Command here 2 ! 
REM ) else if thing2 (
REM command here 2 !
REM ) else (
REM command here 3 !
REM )

0

상황이 다른 경우 처리 방법은 다음과 같습니다.

if %env%==dev ( 
    echo "dev env selected selected"
) else (
    if %env%==prod (
        echo "prod env selected"
    )
)

참고 가 동일하지 않습니다 당신이해야 할 일을 할 것 C ++ 또는 Java하지만 같은 다른 프로그래밍 언어와 같은 경우-ELSEIF 블록으로

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.