1

我有一个编译和运行 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 程序生成输出文件,脚本生成输入并在编译和运行程序后打印输出。

4

2 回答 2

1

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

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

...
REM call :exit
Goto :Exit
...

...
:exit
call:printDate
echo Done...
REM goto:eof
Exit
于 2013-10-18T01:44:49.820 回答
0

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

例子:

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>

于 2019-02-05T10:13:24.610 回答