Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件子程序_Batch File_Subroutine - Fatal编程技术网

Batch file 批处理文件子程序

Batch file 批处理文件子程序,batch-file,subroutine,Batch File,Subroutine,我试图重新使用批处理文件代码,以便在菜单页面中执行类似的任务 主菜单由10多个选项组成。 当我进入每个菜单项时,我需要在文本中显示以下内容 Press [C] to Continue or [X] to exit [C/X]: _ 我每次都在菜单中创建标签,并重新指向负责提示消息和执行必要操作的代码 如何使用下面的代码作为子例程,这样我就不必多次重新编写代码了。把它称为子程序是很容易的 :MiniMenu1 SET INPUT1= SET /P INPUT1=Press [Y] to Cont

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

主菜单由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

啊,想对了。很好

@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
来说,退出、Zap、Kill
应该是明显的

%errorlevel%
中的返回值将显示所选字符的序列号。W=>1,Q=>2..K=>4。在传统构造中,
如果errorlevel n
如果
errorlevel
n
或大于
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.
这比“现代”方式要短

注意:
%*
表示
传递给子例程的所有参数
。这没有巫毒。但是要小心——如果你喜欢,只需文本和一些符号。对
cmd
具有特殊含义的符号可能会导致意外结果


当遇到匹配的
endlocal
时,在
setlocal
之后创建/更改/删除的变量将被删除/恢复/恢复。因此,
setlocal
通常用作批处理中的第一个“操作语句”——批处理结束时,环境将恢复为原始状态

要使用子例程删除批处理中的变量,可以使用

call :zap we dont want these variables

:zap
if "%1" neq "" set "%1="&shift&goto zap
goto :eof
(要删除变量
我们
需要这些
变量

:zap版本2

:zap
for %%a in (%*) do set "%%a="
goto :eof
要删除所有以相同字符模式开头的变量,请使用

FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
(这将删除所有从
$
开始的变量
$
不是神圣的-您可以在此处用
xyz
替换
$
,例如,zap
xyz123
xyz789
xyzylofone

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


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

谢谢,它可以工作。我如何清除setlocal下定义的变量,以防在我再次调用子程序时存储它们。
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="