从没有CALL的另一个批处理脚本中使用LABEL调用批处理脚本

时间:2019-11-30 09:29:18

标签: batch-file cmd

我发现了cmd批处理脚本的一个有趣功能。 问题是:这是文档功能还是错误? (您知道,未记录的意外功能是一个错误:-))

首先,请确保您了解使用CALL和不使用CALL调用脚本之间的区别:

Script.bat
call Script.bat

现在,我有一个批处理库tools.bat

echo tools.bat ARGS: %1 %2 %3 %4
set LABEL=%1
shift /1
goto %LABEL%

:A
echo A ARGS: %1 %2 %3
goto :eof
:B
echo B ARGS: %1 %2 %3
goto :eof

我从另一个脚本中调用它:

@echo off
call :A 1 2 3
call :B 4 5 6
exit /b

:A
:B
tools.bat %*

奇怪但可能有用的行为是,最后一行直接跳到tools.bat中的标签,而不是tools.bat的开头。当我用CALL替换最后一行时,我将不得不实质性地重写脚本,因为使用CALL时,这种意外行为不起作用:

@echo off
call :A 1 2 3
call :B 4 5 6
exit /b

:A
call tools.bat :A %*
goto :eof
:B
call tools.bat :B %*
goto :eof

那么,此功能是否已记录?它可以在WIn7和Win10中使用。

1 个答案:

答案 0 :(得分:1)

这是一个已知的“ hack”,但未由Microsoft记录。 一种可能的用法是创建一个“ libary”脚本,您可以在其中调用特定功能-> https://stackoverflow.com/a/30170342/388389