다음 DOS .bat 파일 코드 세그먼트는 무엇을 표시합니까? 왜? (즉, 처음 생각할 때 행동하지 않는 이유는 무엇입니까?)DOS .bat 파일에서 예기치 않은 변수 subst 동작
세트 VAR = 전에
경우 "%의 VAR %"== "이전"(= 후
세트 VAR]
메아리 %의 VAR %의
)
다음 DOS .bat 파일 코드 세그먼트는 무엇을 표시합니까? 왜? (즉, 처음 생각할 때 행동하지 않는 이유는 무엇입니까?)DOS .bat 파일에서 예기치 않은 변수 subst 동작
세트 VAR = 전에
경우 "%의 VAR %"== "이전"(= 후
세트 VAR]
메아리 %의 VAR %의
)
명백한을 [I 게시하기에 충분한이 가치를이에 대한 답을 알고 있지만 생각] 우리가 루프 내에서 env 변수를 재설정했다면 출력이 "이후"라고 생각할 것입니다.
하지만 출력은 실제로 "이전"입니다. 이유는 명령이 실행될 때가 아니라 명령을 읽을 때 인터프리터가 .bat 파일에서 변수 대체를 수행하기 때문입니다. 따라서 복합 문에 대해 if 문이 처음 발생할 때 본문의 변수가 평가됩니다.
당신이 지연된 환경 변수 확장을 사용하여이 작업을 할 수 있습니다 (활성화)가 필요합니다. 활성화되어있는 경우, 당신은 할 수 있습니다 :
설정 VAR =
전에 "전" "%의 VAR의 %"== (
설정 VAR = 후 경우,
에코 VAR! 당신은 cmd.exe를을 시작할 때/V 옵션을 사용하여 지연된 환경 변수 확장을 사용할 수 있습니다
).
은 [스토리는 - 우리 중 많은 사람은 여전히 더 나은 스크립팅 도구 등 메이크업 절차 등을 분명히 존재하는 드라이브에 .bat 파일 유산을 사용하지만 항상 옵션을 사용하지. 나는이 문제를 잠시 접어 들었고, 같은 일로 머리카락을 뽑은 두 명의 사람들을 최근에 발견했다. 따라서 통역사가 변수 대체 방법을 이해하는 것이 유용합니다.]
퍼센트의 VAR의 %를 대체 명령 실행 전에 발생한다. 여러 줄로 여러 명령이 분산되어 있지만 괄호로 묶인 (...)
은 cmd.exe 파서가 전체 명령을 하나의 명령으로 읽도록합니다. 따라서 실행되는 내용은 다음과 같습니다.
set VAR=before
if "before" == "before" (
set VAR=after;
echo before
)
인터프리터에 표시됩니다.
이 단순한 물건보다 더 무엇을하려고 배치 파일 처리 오히려 고통스러운 암탉을 많은 것들 중 하나입니다.