CMD.exe如何在批处理文件中的给定标签上执行调用?

问题描述 投票:0回答:1

假设我有一个批处理文件。

这个批处理文件有一个标记为

:AppndLog
的“子程序”,它的目的是附加一个日志文件。

这个例程从第 540 行开始。现在 - 此后的其他“子例程”可能会调用这个相同的标签,但是这些例程的ALLAFTER

: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_-_-_-_-_->>>
batch-file method-call
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.