아 어디 - 우측 라인을 따라 생각. 아주 좋아.
@echo off
setlocal
call :ask Question number one
if errorlevel 2 goto Q1X
call :ask Question number two
if errorlevel 2 goto Q2X
::get here for Q1Q2 responses both C
goto :eof
:ask
choice /c CX /N /M "%*"
goto :eof
다음은 기본 템플릿입니다. 프롬프트에서 옵션에 대한 지침은 choice /?
을 입력하십시오.
힌트 : set "choices=wqzk"
그런 다음 서브 루틴 choice /c %choices% /N /M "%*"
에서 사용 가능한 선택 사항을 변경할 수 있습니다. /n
은 사용 가능한 옵션을 묻는 메시지이므로 텍스트에 지정할 필요가 없으므로 예를 들어 wqzk
에 대해 Whatever, Quit, Zap, Kill
이 분명해야합니다.
%errorlevel%
의 결과는 선택한 문자의 시퀀스 번호가됩니다. W ==> 1, Q ==> 2..K ==> 4. errorlevel
이 n
또는보다 큰n
그렇게는 "현대"방법
if %errorlevel%==1 goto QnA1
if %errorlevel%==2 goto QnA2
if %errorlevel%==3 goto QnA3
:: if it gets here, errorlevel is 4 or more hence choice was fourth or later character.
보다 짧은
if errorlevel 4 goto QnA4
if errorlevel 3 goto QnA3
if errorlevel 2 goto QnA2
:: if it gets here, errorlevel is 1 hence choice was first character.
를 사용하는 기존의 것 인 경우 기존의 구조에서, if errorlevel n
비교는 사실이다 참고 : %*
은 all of the arguments passed to the subroutine
을 의미하므로 /m "%*"
은 전달 된 인수를 깔끔하게 표시합니다. 그것에 대한 부두는 없습니다. 그러나 조심하십시오 - 원할 경우 텍스트 만 표시하고 몇 가지 기호가 있으면주의하십시오. cmd
에 특별한 의미를 가진 기호 예기치 않은 결과가
변수가 발생할 수 있습니다 생성/변경/A setlocal
후 삭제가 삭제됩니다/복원/일치하는 endlocal
가 발견 될 때 부활. 결과적으로 setlocal
은 배치의 첫 번째 "동작 문"으로 자주 사용됩니다. 배치가 끝나면 환경이 원래 상태로 복원됩니다.서브 루틴을 사용하여 배치 내에서 변수를 제거하려면
, 당신은
call :zap we dont want these variables
:zap
if "%1" neq "" set "%1="&shift&goto zap
goto :eof
이 (변수
we
dont
want
these
및
variables
또는 :zap version 2
:zap
for %%a in (%*) do set "%%a="
goto :eof
변수를 제거하려면을 삭제하는 데 사용할 수있는 모두 동일한 문자로 시작합니다.
FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
($
을 시작하는 모든 변수가 제거됩니다. ... 여기 $
에 대한 xyz
을 대체하고 xyz123
xyz789
및
당연히 예를 들어 xyzylofone
가), 당신은 또한 기술을 결합 할 수 보내 겠 수
그러나 - - $
거룩하지 않습니다 그것은 새로운 물어 비용이 아니다 질문에. 전혀 비싸지 않습니다. 심지어 싼. 새로운 질문을하기보다는 기존 문제에 더 많은 이슈를 태깅하는 것이 솔루션을 더 쉽게 찾을 수있게합니다. (예를 들어 누군가가 변수를 삭제하는 방법을 알고 싶다면 "배치 파일 서브 루틴"이라는 제목의 질문에서 찾을 수 있습니다. saga이되는 것을 방지합니다.
감사합니다. 저장되어있는 경우 setlocal에서 정의 된 변수를 지우려면 어떻게해야합니까? 내가 서브 루틴을 다시 호출 할 때. –