이것은 정말 이상하고 interessting 버그입니다!
GOTO
대신 CALL
을 사용하면 그 원인이 분명해질 것입니다.
goto :notExist || call :someLabel
당신은 배치 파일의 외부 레이블을 호출하는
불법과 같은 오류 메시지가 나타납니다.
분명히 파서는 여기서 cmd- 라인 컨텍스트로 전환합니다!
첫 번째 고토가 레이블을 찾지 못한 경우이 작업이 수행됩니다.
처음 사용할 때 call
모두 정상적으로 작동합니다.
call :noLabel 2>nul || goto :thisWorks
이것은 실패 goto
의 일반적인 부작용 보인다.
goto가 실패하면 일반적으로 배치 파일을 즉시 중지합니다.
그러나 ||
연산자를 사용하면 다음 명령이 강제로 실행됩니다.
하지만 더 효과가있는 것 같습니다. exit /b
이므로이 효과를 사용하여 함수를 남길 수 있습니다.
@echo off
setlocal DisableDelayedExpansion
set var=111
call :myFunc
set var
exit /b
:myFunc
setlocal EnableDelayedExpansion
set var=222
goto :noLabel 2>nul || set var=333!var!
echo This will be never reached
exit /b
interessting 출력
VAR = 333! VAR!
그래서 goto :noLabel
exit /b
같은 역할을하고 또한 암시 ENDLOCAL
|| set var=333!var!
부분 전에 실행 완료.
같은 문제는 (그러나 ||
연산자없이)가 아니라 제와 오도 Dostips: Rules for label names vs GOTO and CALL
출처
2014-04-28 08:17:21
jeb
+1 논의하지만 이유 조건부 실행 에코 작업용 작동 되었는가? 'goto'는 전체적으로 괄호와 리디렉션/조건부 실행 컨텍스트를 깰 수 있지만 전체 응답이라고 생각하지는 않습니다 ... – npocmaka