2014-09-20 24 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提示了可用的選項,因此您不需要在文本中指定該文字,只需使其明顯 - Whatever, Quit, Zap, Kill應該是明顯的,例如wqzk

%errorlevel%將返回所選字符的序列號。 W ==> 1,Q ==> 2..K ==> 4。在傳統的結構,if errorlevel n比較結果爲真,如果errorleveln或大於n所以這將是傳統使用

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%==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. 

短注意:%*表示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 

(刪除變量wedontwantthesevariables

:zap version 2

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

要刪除變量所有這些都以相同的特徵開始cter-pattern,使用

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

(它將刪除從$開始的所有變量。 $是不聖潔的 - 你可以爲$替代xyz這裏和ZAP xyz123xyz789xyzylofone例如)

當然,您也可以結合的技術...

但是 - 它不是昂貴提出新關於SO的問題。一點都不貴。便宜甚至。提出一個新問題,而不是將更多問題標記到現有問題上使得找到解決方案變得更容易(例如,想要知道如何刪除變量的人可能不希望在標題爲「批處理文件子例程」的問題下找到它。它也可以防止問題變成傳奇

+0

感謝它的工作如何清除setlocal下定義的變量,如果它們被存儲當我再次調用子例程。 – 2014-09-20 09:11:53