Goto
在批处理程序中,将 Windows XP 导入到由标签标识的行。找到标签后,程序将处理从下一行开始的命令。
语法
goto label
参数
- label
- 指定所要转向的批处理程序中的行。
- /?
- 在命令提示符显示帮助。
注释
- 使用命令扩展
如果启用了命令扩展(即默认状态),并且使用带有目标标签为 :EOF 的 goto 命令,则可以在不定义标签的情况下将控制传送到当前批处理脚本文件的末端,然后退出批处理脚本文件。使用 goto 和 :EOF 标签时,必须在标签前插入冒号。例如:
goto :EOF
有关使该功能有用的 call 命令的信息,请参阅相关主题中的 cmd。
- 使用有效的 label 值
可以在 label 参数中使用空格,但不得包括其他分隔符(例如分号或等号)。goto 命令只使用标签的前八个字符。例如,下面的标签是等效的,且都将解析为 :hithere0:
:hithere0
:hithere01
:hithere02
- 将 label 参数与批处理程序中的标签进行匹配
所指定的 label 值必须与批处理程序中的标签匹配。批处理程序中的标签必须以冒号 (:) 开始。Windows XP 可以识别以冒号 (:) 开头作为标签的批处理程序行并且不会将它作为命令处理。如果某行以冒号开始,则该行的任何命令都将被忽略。如果批处理程序没有包含指定的标签,则批处理程序将停止并显示以下消息:
Label not found
- 对条件操作使用 goto
可以将 goto命令 与其他命令一起使用,从而执行条件操作。有关使用 goto命令执行条件操作的详细信息,请参阅“相关主题”中的 if。
对于 Goto 来说,他的跳转是可以实现循环的,如下示例:
::示例52: @echo off :hanye set /a guxing+=1 echo %guxing% if %guxing% neq 5 goto hanye pause |
注意:在不使用 call 的情况下,必须使用含 if 的语句进行判断,以完成跳出循环,否则将是无限循环。
我们看一个 Goto 与 Call 组合使用的示例:
::示例53 @echo off call :han 1 2 3 4 5 pause&exit :han if "%1" neq "" ( echo %1 shift /1 &goto han ) |
在这里, call :han 1 2 3 4 5 将数值传递给变量 %1 %2 %3 %4 %5...,在子批处理 :han 中,首先显示 echo %1 ,即显示1。 shift /1 将 %1 开始,每个参数复制到前一个参数。 %5 复制到 %4 ,%4 复制到 %3 ,%3 复制到 %2 ,%2 复制到 %1,这个时候 %5 为空,即 %1 %2 %3 %4 依次为2 3 4 5。然后返回标签处,显示 echo %1 ,即显示2。 shift /1 将 %1 开始,每个参数复制到前一个参数。 %4 复制到 %3 ,%3 复制到 %2 ,%2 复制到 %1,这个时候 %4 %5 为空,即 %1 %2 %3 依次为3 4 5。依此类推,当 %1 为5被 echo %1 后,%1 也为空,退出 :han ,返回 call :han 1 2 3 4 5 处,执行下一行代码。
Shift 更改批处理文件中批处理参数的位置。 注释 - 将 shift 命令行选项与命令扩展一起使用
启用命令扩展(默认设置)后,shift 命令支持 /n 命令行选项,该选项通知命令在第 n 个参数处开始更改,n 可以是 0 到 8 的任何一个值。例如, SHIFT /2 可以将 %3 改为 %2,将 %4 改为 %3 等等,而 %0 和 %1 保持不变。 - shift 命令的工作原理
shift 命令通过将每个参数复制到前一个参数中,更改批处理参数 %0 到 %9 的值。也就是说,将 %1 的值复制到 %0,%2 的值复制到 %1,依次类推。该命令在撰写对任何数目的参数执行相同操作的批处理文件时非常有用。 - 使用 10 个以上的批处理参数
也可以使用 shift 命令创建可以接受 10 个以上批处理参数的批处理文件。如果在命令行上指定了 10 个以上的参数,第十个 (%9) 参数之后的参数将更改为 %9,一次更改一个。 - 将 %* 与 shift 一起使用
Shift 对 %* 批处理参数没有影响。 - 恢复参数
没有反向的 shift 命令。执行了 shift 命令后,不能恢复更改前存在的第一个批处理参数 (%0)。
|
我们来看下面的示例:
::示例54 @echo off call :han 1 2 3 4 5 pause goto :eof :han for /l %%i in (1 1 5) do ( call echo %%1 shift /1 ) |
注意:这里的 for /l 并不是用来直接显示数字的,而是用来控制递归次数的。
在这一示例中, call :han 1 2 3 4 5 将数值传递给变量 %1 %2 %3 %4 %5...,在子批处理 :han 中,首先显示 echo %%1 ,即显示1(因为被 call echo ,所以 %1 变成了 %%1 以捕获 %1 的动态变化)。 shift /1 将 %1 开始,每个参数复制到前一个参数。 %5 复制到 %4 ,%4 复制到 %3 ,%3 复制到 %2 ,%2 复制到 %1,这个时候 %5 为空,即 %1 %2 %3 %4 依次为2 3 4 5。然后返回标签处,显示 echo %1 ,即显示2。 shift /1 将 %1 开始,每个参数复制到前一个参数。 %4 复制到 %3 ,%3 复制到 %2 ,%2 复制到 %1,这个时候 %4 %5 为空,即 %1 %2 %3 依次为3 4 5。依此类推,当 %1 为5被 echo %1 后, for /l %%i in (1 1 5) do ( 完成参数的传递次数控制,退出 :han ,返回 call :han 1 2 3 4 5 处,执行下一行代码。
因为没有使用 goto han ,而是在 for 内的复合句,所以需要动态捕获。而在示例53中,虽然 %1 也发生了变化,但其 echo %1 是在 goto han 之后执行的,即 if "%1" neq "" () 被执行了5次。这5次是执行的,而不是在预处理中进行的,所以不需要动态捕获。
Call
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法
call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数
- [Drive:}[Path] FileName
- 指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。
- BatchParameters
- 指定批处理程序所需的任何命令行信息,包括命令行选项、文件名、批处理参数(从 %0 到 %9)或变量(例如,%baud%)。
- :label
- 指定批处理程序要跳转到的标签。使用带有该参数的 call 命令可以创建新的批处理文件上下文,并将控制权交给指定标签后的语句。当首次遇到该批处理文件的末尾时(在跳转到标签后),控制权将交还给 CALL 语句后的语句。第二次遇到批处理文件的末尾,批脚本将被退出。对于可允许您从批处理脚本返回的 goto :eof 命令扩展,要了解关于它的说明,请参阅“相关主题”。
- arguments
- 对于以 :label 打头的批处理程序,指定要传送给其新实例的命令行信息,包括命令行选项、文件名、批处理参数(从 %1 到 %9)或者变量(比如 %baud%)。
- /?
- 在命令提示符显示帮助。
注释
- 使用批处理参数
批处理参数可以含有传送给批处理程序的任何信息,包括命令行选项、文件名、批处理参数(从 %1 到 %9)或者变量(例如,%baud%)。有关批处理参数的详细信息,请参阅“相关主题”。
- 使用管道和重定向符号
不要在 call 命令中使用管道和重定向符号。
- 发出递归调用
可以创建调用自身的批处理程序,但是,必须提供退出条件。否则,父和子批处理程序可以无限循环。
- 使用命令扩展
如果启用命令扩展(即默认情况下),call 将接受 label 参数作为调用目标。正确语法如下:
call :label arguments
有关启用和禁用命令扩展的详细信息,请参阅“相关主题”中的 cmd。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。