2014-08-29 3 views
0

내가 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).

+1

지연 확장 .... – npocmaka

+0

npocmaka,'setlocal EnableDelayedExpansion'을 추가해도 차이가 없습니다. 이것이 파서 버그라고 의심하지만, 어떤 식 으로든 변수 확장과 분명히 관련이 없습니다. –

+1

지연 확장이 사용되는 경우 변수는'%'대신'!'로 묶어야합니다. 최소한 괄호 안에 있으면. – npocmaka

답변

1
@echo off 
setlocal enableDelayedExpansion 

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!} 
) 
Endlocal 

이 방법이 유용합니까?