배치 파일. if 문 내의 If 문

배치 파일. if 문 내의 If 문

다음 코드를 작성하려고 합니다.

If %dropmode%==on (
If %drop% LEQ %potiondrop% (
set /a potion=%potion%+1
)
If %drop2% LEQ %potiondrop% (
set /a potion=%potion%+1
)
)

따라서 "if %drop2% LEQ %potiondrop%" 조건은 작동하지 않지만 "if %drop% LEQ %potiondrop%" 조건은 작동합니다. 무엇을 해야 할까요?

답변1

문제는 CMD.EXE로 알려진 Windows 명령 프롬프트/명령줄 해석기(CLI)에 버그가 있다는 것입니다(글쎄, Microsoft에서는 이것이 기능이라고 생각합니다). 버그가 다음과 같은 블록 구성을 읽을 때 발생합니다 IF … ( … ). 루프 는 모든 변수를 FOR해석합니다.%variable_name%즉시, 루프나 블록이 실행되기 전. 귀하의 예에서 블록 potion을 입력할 때 가 0 이면 해당 블록 내부 If %dropmode%==on ( … )의 모든 발생은 0으로 평가되므로 블록 내부를 변경하더라도 %potion%두 명령문 모두 set로 처리됩니다 . 이는 귀하가 보고한 화면 출력에서 ​​명백히 드러납니다.set /a potion=0+1potion

수정 사항은 변수를 참조하는 명령문이 실행될 때 변수가 적절한 시점에 확장되도록 CMD에 지시하는 것입니다. 추가하면 이렇게 됩니다.

setlocal enabledelayedexpansion

배치 파일 시작 부분 근처 어딘가에 계산 코드를 다음과 같이 변경합니다.

    set /a potion=!potion!+1

양식을 사용하여 지연된 확장을 활성화합니다. 자세한 내용은 및 를 참조하세요 .!variable_name!SET /?SETLOCAL /?


%PS 또 다른 해결책은 단순히 명령문 에서 문자를 제거 set하고 다음과 같이 말하는 것입니다.

set /a potion=potion+1

관련 정보