【问题标题】:Windows batch function gets called an extra timeWindows 批处理函数被调用了额外的时间
【发布时间】:2013-10-18 01:35:56
【问题描述】:

我有一个编译和运行 Java 程序的批处理脚本,并且在执行此操作时会打印任务开始时间的时间戳。我注意到:printDate 函数在最后被调用了一次,但:exit 应该在打印“完成...”之后结束脚本。

@echo off

set PRGM=Foo
cls

call :printDate
echo Compiling...
javac %PRGM%.java

call :printDate
echo Executing...
java %PRGM%

call :printDate
echo Results...
type output.txt

call :exit

:: ----------------------------------------------------------
:: Functions
:: ----------------------------------------------------------

:printDate
for /f "tokens=2-4 delims=/ " %%a in ('echo %DATE%') do (set mydate=%%c/%%a/%%b)
for /f "tokens=1-3 delims=/:./ " %%a in ('echo %TIME%') do (set mytime=%%a:%%b:%%c)
echo|set /p=[%mydate% %mytime%] 
goto:eof

:exit
call:printDate
echo Done...
goto:eof

这是我的输出

[2013/10/17 21:26:11] Compiling...
[2013/10/17 21:26:12] Executing...
[2013/10/17 21:26:12] Results...
2
6
6
5
[2013/10/17 21:26:12] Done...
[2013/10/17 21:26:12]

编辑

如果有人感兴趣,这是我的工作脚本:http://pastebin.com/xfwStvNK。我的Java程序生成输出文件,脚本生成输入并在编译运行程序后打印输出。

【问题讨论】:

    标签: windows function batch-file javac goto


    【解决方案1】:

    :printDate 过程被再次调用,因为您在调用:exit 过程时没有完成执行,您在:exit 过程中调用:printDate,但在您返回的echo Done 之后到call :exit 行,所以:printDate 块被再处理一次然后:printDate 内的goto:eof 行实际上是脚本的真正结尾。

    这就是Call的意思,而你需要使用GoTo关键字,像这样:

    ...
    REM call :exit
    Goto :Exit
    ...
    
    ...
    :exit
    call:printDate
    echo Done...
    REM goto:eof
    Exit
    

    【讨论】:

    • 所以我只是在程序的最后指定了一个名为:Exit 的标签,因为我不希望脚本杀死命令行。这行得通,非常感谢。这是我更新的脚本:pastebin.com/xfwStvNK
    • 有没有更好的;从函数返回比goto:eof更有效的方式?
    • @Mr. Polywhirl 不是,但你为什么试图用“更好;更高效”来表示?,去 EndOfFile 是唯一的方法,效率更高,而 Batch 它是一种“批处理”语言。请随时将此答案标记为“已接受”如果代码已解决您的问题,感谢您阅读并原谅我的英语。
    • 我会做更多的研究。感谢您的回答,它帮助我了解发生了什么。
    • 在这里找到我的答案:goto - "在 NT 中,对子程序标签 (CALL :label) 的调用,结合 GOTO :EOF 来终止子程序,提供了一种方法创建真正的子例程,GOTO :EOF 是跳转回调用子例程的指令。” 这是基于这篇博文的最佳选择。
    【解决方案2】:

    始终使用 Goto 标签来终止您的 main 程序。

    例子:

    echo hello world<br>
    call:doFirstThing<br>
    call:doSecondThing<br>
    <p>
    Goto :FinalExit<br>
    <p>
    :doFirstThing<br>
    echo in the first method<br>
    goto:eof<br>
    <p>
    :doSecondThing<br>
    echo in the second method<br>
    goto:eof<br>
    <p>
    FinalExit<br>

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 2012-09-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 2013-03-01
      • 2012-06-17
      相关资源
      最近更新 更多