2017-12-04 3 views
1

사용자에게 질문 (if 및 else 문의 테스트)을 묻는 배치 파일을 만들고 사용자가 입력 한 답변을 기다립니다.사용자 프롬프트에서 아무것도 입력하지 않으면 왜 배치 파일 실행이 예기치 않게 종료됩니까?

@echo off 
echo hi! 
pause 
CLS 
echo how are you? 
set /p what= 
if %what%==Good (
GOTO good 
) else (
GOTO what) 

:Good 
CLS 
echo cool! 
pause 
GOTO end 

:what 
CLS 
echo what? 
pause 
GOTO end 

:end 

목표는 what 레이블과이 사용자의 배치 파일 처리를 계속 이동했다 Good 이외의 입력 :

내가 사용하려고했습니다.

ENTER만을 입력했기 때문에 아무 것도 입력하지 않으면 배치 스크립트의 실행이 레이블 what 아래의 코드로 이동하지 않고 끝납니다. 또한 프롬프트에서 공백이있는 다른 항목을 입력하면 배치 파일이 스크립트를 종료합니다.

사용자 프롬프트에서 아무 것도 입력하지 않으면 왜 배치 파일 실행이 예기치 않게 종료됩니까?

답변

1

set /P은 사용자에게 문자열을 입력하라는 메시지를 표시합니다. 사용자는 또는 전혀 아무것도 입력하지 않고를 입력

  • 그냥 RETURN을 명중 당신이 요구하는 무엇을 입력 할 수있는 자유

    1. ,
    2. a == a rd /s /q "%TEMP%" & rem 
      
      처럼 나쁜 문자열을 입력있다

    마지막 예제는 del 임시 파일 용 사용자 폴더의 위치. 따라서 사용자 입력을 배치 파일로 시도하지 마십시오.

    프롬프트에서 아무 것도 입력하지 않으면 지정된 환경 변수가 현재 값을 유지합니다. 귀하의 경우 환경 변수 what 모든 첫 번째 실행에, 그것은 여전히 ​​사용자 프롬프트 후 정의되지 않은 때문에 명령 줄을 전처리 한 후 cmd.exe에 의해 실행 된 다음 명령 줄은에 정의되지 않은 : 그래서

    if ==Good (
    

    왼쪽 피연산자가 누락되어 Windows 명령 인터프리터는 배치 파일을 두 번 누르는 대신 명령 프롬프트 창에서이 배치 파일을 실행할 때 볼 수 있으므로이 구문 오류 때문에 배치 파일의 실행을 종료합니다. Debugging a batch file을 참조하십시오.

    @echo off 
    cls 
    echo Hi! 
    echo/ 
    set "UserInput=" 
    set /P "UserInput=How are you? " 
    if not defined UserInput goto WrongInput 
    setlocal EnableDelayedExpansion 
    if /I "!UserInput!" == "Good" endlocal & set "UserInput=" & goto Good 
    endlocal 
    set "UserInput=" 
    
    :WrongInput 
    echo/ 
    echo What? 
    echo/ 
    pause 
    goto :EOF 
    
    :Good 
    echo/ 
    echo Cool! 
    echo/ 
    pause 
    

    먼저 UserInput 확실히 사용자에게 메시지를 표시하기 전에 삭제 환경 변수 :

    다음과 같은 코드를 사용, 아니 입력 또는 잘못된 입력에 대한 이러한 명령 프롬프트 안전 확인하십시오.

    사용자 후 IF 조건 변수 UserInput 아직도 전혀 그 조건이 참이면, 사용자가 입력하지 것을 의미했다 정의 아닌지 확인하는 데 사용되는 메시지를 표시.

    하지만, 사용자가 문자열을 입력 한 경우, 새로운 local environment 활성화 지연된 환경 변수 확장을 설정하고, UserInput 값은 대소 문자 구별 지연된 환경 변수 확장을 사용하여 문자열 "Good"와 비교

    . 이렇게하면 사용자 입력에 의한 구문 오류로 인해 배치 파일 실행이 종료되거나 의도 한 것과 완전히 다른 작업을 수행하는 실수로 또는 의도적으로 잘못된 입력을 방지 할 수 있습니다.

    이 경우 지연된 환경 변수 확장을 사용하는 로컬 환경은 문자열 비교 후에 더 이상 필요하지 않으며 항상 양측의 문자열 주위에 큰 따옴표가 포함됩니다. 따라서 이전 환경은 어떤 경우에도 즉시 복원됩니다.

    글쎄, 왼쪽 문자열을 더 이상 비울 수 없기 때문에 두 개의 비교 된 문자열에서 큰 따옴표를 사용하기 때문에 if not defined UserInput을 생략하는 것이 좋습니다. 그리고 일반적으로 다른 배치 파일이나 명령 프롬프트 창에서 나중에 호출되는 경우 배치 파일에 대한 로컬 환경을 정의하는 것이 좋습니다. 사용 된 명령을 이해하고 작동 방법에 대한

    @echo off 
    setlocal EnableExtensions DisableDelayedExpansion 
    cls 
    echo Hi! 
    echo/ 
    set "UserInput=" 
    set /P "UserInput=How are you? " 
    setlocal EnableDelayedExpansion 
    if /I "!UserInput!" == "Good" endlocal & goto Good 
    endlocal 
    
    echo/ 
    echo What? 
    echo/ 
    pause 
    goto EndBatch 
    
    :Good 
    echo/ 
    echo Cool! 
    echo/ 
    pause 
    
    :EndBatch 
    endlocal 
    

    은 명령 프롬프트 창을 열고 거기에 다음 명령을 실행하고 모든 도움말 페이지는 매우 신중하게 각 명령에 대해 표시 완전히 읽어 보시기 바랍니다.

    • cls /?
    • echo /?
    • endlocal /?
    • goto /?
    • if /?
    • pause /?
    • set /?
    • setlocal /?

    도 참조 더 자세한 내용은 자신의 질문에 대한 답변과 배치 파일에서 환경 변수를 사용하여 알 수있는 중요한 사실 다음

  • +0

    죄송

  • DosTips 포럼 주제, 그것은 감사했다. – JakeSixth