내가 set /p VAR=PROMPT
과로 실행 해요 미치게하는 버그가 있습니다 윈도우 7에서 프로그램을 설치하는 간단한 배치 파일을 작성했습니다 :변수가 설정되지 않습니다/P 내부 IF 문
입력 폐기가
@echo off
setlocal
if exist "%USERPROFILE%\Documents" (
set /p CONFIRM="Previous version is installed! Continue? (Y/n) "
echo {%CONFIRM%}
)
if exist "%USERPROFILE%\Documents" (
set /p CONFIRM="Previous version is installed! Continue? (Y/n) "
echo {%CONFIRM%}
)
나는 그것을 실행 : 여기
버그
간단한 테스트 케이스의Previous version is installed! Continue? (Y/n) n
{}
Previous version is installed! Continue? (Y/n) n
{n}
첫 번째 set /p
이 실행되면 실제로 입력 내용이 저장되지 않습니다.
프롬프트 맹 글링 버그 (관련?)
나는 생각한다, 그러나 이것은 괄호가 정의 내부의 경우 첫 번째 )
에서 프롬프트를 잘라내는 것을 특징으로 set /p
에 더 명백한 버그에 관련이 있는지, 확실하지 않다
Previous version is installed! Continue? (Y/nn
{n}
다음
if
블록 :이 프롬프트를 미치게 있지만
@echo off
if exist "%USERPROFILE%\Documents" (
set /p CONFIRM=Previous version is installed! Continue? (Y/n)
echo {%CONFIRM%}
)
은 적어도이 버전은, 내 입력을 캡처
해결 방법은 무엇입니까?
아이디어가 있으십니까? 아니면 set /p
그냥 쓸모가 없어 그렇게 버그가 무엇입니까?
편집 : 결론
@npocmaka에서 링크와 팁덕분에, 내가 무슨 일이 일어나고 있는지 더 나은 아이디어가 생각 : "실행 시간"대 "시간을 구문 분석의"()
내부 동일하지 않습니다 밖으로 - 낙오자 블록. 따라서이 예 : 지연 확장이 작동
?foo
{}
?bar
{foo}
{bar}
하지만, 난 아직도 믿을 :
실행@echo off
(
set /p CONFIRM=^?
echo {%CONFIRM%}
)
(
set /p CONFIRM=^?
echo {%CONFIRM%}
)
echo {%CONFIRM%}
, 그것은 블록 내부의 기대 값을 얻는 변수에 "지연"가 있음을 분명 문제는 내가 읽은 모든 설명과 일치하지 않습니다. set /p
이 어떻게 작동 할 것으로 예상되는지는 배치 파일의 과정과 동일합니다. set /p
에 의해 설정된 변수는 블럭 안에 나타날 때 을 제외하고 마술로 해석 시간 확장을 벗어나는 것으로 나타납니다.
"프롬프트 맹 글링"버전은 우연히 블록을 일찍 닫고 배치 파일 프로세서가 두 번째 불일치 인 )
에 대해 불만을 나타 내기 때문에 작동합니다 (sorta).
지연 확장 .... – npocmaka
npocmaka,'setlocal EnableDelayedExpansion'을 추가해도 차이가 없습니다. 이것이 파서 버그라고 의심하지만, 어떤 식 으로든 변수 확장과 분명히 관련이 없습니다. –
지연 확장이 사용되는 경우 변수는'%'대신'!'로 묶어야합니다. 최소한 괄호 안에 있으면. – npocmaka