2013-10-18 29 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

相關問題