假设我有一个批处理文件。
这个批处理文件有一个标记为
:AppndLog
的“子程序”,它的目的是附加一个日志文件。
这个例程从第 540 行开始。现在 - 此后的其他“子例程”可能会调用这个相同的标签,但是这些例程的ALL 是AFTER
:AppndLog
标签。 . . .
所以问题来了 - 将这个
:AppndLog
(以及任何其他广泛访问的“例程”)放在文件的 END
而不是开头更有效吗?假设这个批处理文件有 7k 行操作。 . .
CMD.Exe
是解释这个并在第一次调用它的行开始搜索标签,转到文件末尾并循环,还是首先转到文件开头?
奖励积分 -
Goto :EOF
命令是否在 subroutine
末尾到文件末尾之间的行中跋涉?
在我调用此例程时使用
echo
简单地>>%log%
要记录的数据要快得多,但是我失去了在每一行上输出日期的能力,而无需在其他地方进行另一个调用。 . . (一个真正的“有趣”延迟是使 :AppndLog
例程调用一个 :GetDate
例程,其中产生了开始的日期信息。。。。
REM ╔══════════════════════════════════════════════════════╗
REM ║ -AppndLog- ║
REM ║Appends log file with provided data if Logging GEQ # ║
REM ╚══════════════════════════════════════════════════════╝
REM <<<-_-_-_-_-_BEGIN :AppndLog_-_-_-_-_->>>
:AppndLog [Logging Level Check] [Data to Append]
REM If "!Logging!" GEQ "2" Echo Append Data to Log. >>%log%
REM for /f "Tokens=1,2 Delims=." %%a in ('wmic os get localdatetime ^|Findstr /R ^^[0-9]') do (set UTCDate=%%a & set curMS=%%b)
REM Call :GetDate
set myDate=!date:/=!
set myTime=!time::=!
set myTime=!myTime:.=!
set "fullDate=!myDate!!myTime!"
If not "%~1"=="" (
Echo !fullDate! :: %~1 >>%log%
If "!Verbose!" GEQ "3" Echo %~2
) Else (
Echo !fullDate! >>%log%
If "!Verbose!" GEQ "3" Echo.
)
Goto :EOF
REM <<<-_-_-_-_-_END :AppndLog_-_-_-_-_->>>
goto label
和 call :label
都从 goto/call 之后的行搜索标签。如果没有找到,则从文件开头继续查找。这意味着将目标标签和子例程放置在调用行下方(文件末尾)会更有效。
goto :EOF
形式不搜索;它立即终止子程序/文件。 exit /B
命令相当于goto :EOF
我以前用exit /B
结束子程序,goto :EOF
结束主批处理文件。
奖金信息
此行为允许 重复相同的标签,因此
goto repeatedLabel
将始终转到 goto
之后放置的下一个标签。当有多个 goto 到 near forward 标签时,这很有用。为了明确这个目的,不被错误混淆,你可以使用MASM32用于相同目的的相同方法:调用
@F
重复标签:
echo First goto near forward label
goto @F
echo This don't appears
:@F
echo Second goto near forward label
goto @F
echo Neither this appears...
:@F
echo OK