【问题标题】:batch file sub routine批处理文件子程序
【发布时间】:2014-09-20 03:30:58
【问题描述】:

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

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

【问题讨论】:

    标签: batch-file subroutine


    【解决方案1】:

    啊 - 沿着正确的路线思考。很好。

    @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 有特殊含义的符号可能会导致意想不到的结果


    当遇到匹配的endlocal 时,在setlocal 之后创建/更改/删除的变量将被删除/恢复/复活。因此,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
    

    要删除所有以相同字符模式开头的变量,请使用

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

    (这将删除以 $ 开头的所有变量。$ 不是神圣的 - 你可以在这里用 xyz 代替 $ 并 zap xyz123 xyz789xyzylofone 例如)

    当然,你也可以结合这些技术......

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

    【讨论】:

    • 谢谢它的工作。如何清除setlocal下定义的变量,以防它们被存储当我再次调用子例程时。
    最近更新 更多