2014-09-20 4 views
0

메뉴 페이지에서 유사한 작업을 수행하기 위해 배치 파일 코드를 다시 사용하려고합니다.배치 파일 서브 루틴

주 메뉴는 10 개 이상의 옵션으로 구성됩니다. 나는 각 메뉴 항목 내부에 갈 때 , 나는 내가 각 메뉴의 시간에 레이블을 만들어 다시 직접 메시지를 자극을 담당하는 코드 및 필요한 조치를 할

Press [C] to Continue or [X] to exit [C/X]: _ 

텍스트에 다음 표시해야 .

다음 코드를 서브 루틴으로 사용하면 코드를 여러 번 다시 작성할 필요가 없습니다. 각 메뉴 항목에 하드 코딩 할 때가 있습니다. 서브 루틴으로 부르기 란 쉽다.

:MiniMenu1 
SET INPUT1= 
SET /P INPUT1=Press [Y] to Continue Installation or [N] to go back [Y/N]: 
IF /I '%INPUT1%'=='y' GOTO Mini_cont1 
IF /I '%INPUT1%'=='n' GOTO Mini_back1 
ECHO ============INVALID INPUT============ 
ECHO Please select a number from the Menu Options 
ECHO ------------------------------------- 
ECHO ======PRESS ANY KEY TO CONTINUE====== 

PAUSE > NUL 
GOTO MiniMenu1 

메인 메뉴 항목 페이지에 대한 내 코드로

:Selection1 
:: MAin menu item 1 
    GOTO MiniMenu1 
:Mini_cont1 
:: xCopy update.zip C:\python27\ /y 
@echo Update Completed. 
pause 
:Mini_back1 
:: end 
GOTO MENU 

답변

0

아 어디 - 우측 라인을 따라 생각. 아주 좋아.

@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. errorleveln또는보다 큰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 thesevariables

또는 :zap version 2

:zap 
for %%a in (%*) do set "%%a=" 
goto :eof 

변수를 제거하려면을 삭제하는 데 사용할 수있는 모두 동일한 문자로 시작합니다.

FOR /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a=" 

($을 시작하는 모든 변수가 제거됩니다. ... 여기 $에 대한 xyz을 대체하고 xyz123xyz789

당연히 예를 들어 xyzylofone가), 당신은 또한 기술을 결합 할 수 보내 겠 수

그러나 - - $ 거룩하지 않습니다 그것은 새로운 물어 비용이 아니다 질문에. 전혀 비싸지 않습니다. 심지어 싼. 새로운 질문을하기보다는 기존 문제에 더 많은 이슈를 태깅하는 것이 솔루션을 더 쉽게 찾을 수있게합니다. (예를 들어 누군가가 변수를 삭제하는 방법을 알고 싶다면 "배치 파일 서브 루틴"이라는 제목의 질문에서 찾을 수 있습니다. saga이되는 것을 방지합니다.

+0

감사합니다. 저장되어있는 경우 setlocal에서 정의 된 변수를 지우려면 어떻게해야합니까? 내가 서브 루틴을 다시 호출 할 때. –