我有一个编译和运行Java程序的批处理脚本,并且在执行此操作时会打印任务开始时的时间戳。我注意到:printDate
函数在最后被称为额外的时间,但是:exit
应该在" Done ..."之后结束脚本。打印出来。
@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程序生成输出文件,脚本生成输入并在编译和运行程序后打印输出。
答案 0 :(得分:1)
:printDate
过程被另一次调用,因为您在调用:exit
过程时没有完成执行,而是在:printDate
过程中调用:exit
但是在echo Done
之后,您返回到call :exit
行,以便再次处理:printDate
块,然后goto:eof
内的:printDate
行才真正结束的剧本。
这是Call
的含义,您需要使用GoTo
关键字,如下所示:
...
REM call :exit
Goto :Exit
...
...
:exit
call:printDate
echo Done...
REM goto:eof
Exit
答案 1 :(得分:0)
始终使用转到标签终止主程序。
示例:
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>