批处理文件子例程

时间:2014-09-20 03:30:59

标签: batch-file subroutine

我正在尝试重新使用批处理文件代码,以便在菜单页面中执行类似的任务。

主菜单包含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

1 个答案:

答案 0 :(得分: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 具有特殊含义的符号可能会导致意外结果


当遇到匹配的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替换$并点击xyz123例如xyz789xyzylofone

当然,您也可以结合使用这些技术......

但是 - 在SO上提出新问题并不昂贵。一点都不贵。便宜甚至。提出一个新问题而不是将更多问题标记到现有问题上会使查找解决方案变得更容易(例如......有人想要知道如何删除变量可能不会期望在标题为"批处理文件的问题下找到它子例程"例如。它还可以防止问题成为传奇