2013-10-18 15 views
1

我有一个批处理脚本,编译和运行一个Java程序,因为它是这样做的,它打印任务启动时间的时间戳。我注意到:printDate函数在最后被称为额外时间,但:exit应该在打印完成“完成...”后结束脚本。Windows批处理函数被调用一个额外的时间

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

回答

1

:printDate过程被称为另一个时间,因为调用:exit过程中,您呼叫的:printDate:exit程序,但echo Done之后要返回到call :exit行,以便:printDate块被处理时没有完成的执行再多一次,里面的goto:eof行就是脚本的真实结尾。

这是一个Call的meanning,相反,你需要使用GoTo关键字,像这样:

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

... 
:exit 
call:printDate 
echo Done... 
REM goto:eof 
Exit 
+0

所以我只是在节目的最后叫'指定一个标签:Exit'因为我不希望脚本杀死命令行。这工作,非常感谢。这里是我更新的脚本:http://pastebin.com/xfwStvNK –

+0

有更好的;比'goto:eof'更有效的函数返回方式? –

+0

@Mr。 Polywhirl不是,但你为什么试图用“更好,更高效”的意思呢?去EndOfFile是唯一的方法,同时批处理是一种“批处理”语言。请随意将此答案标记为“已接受”如果代码已解决您的问题,请感谢您的阅读并原谅我的英语。 – ElektroStudios

相关问题