2012-04-13 24 views
42

有沒有什麼能夠模仿像Java,C#等那樣的方法?在批處理文件中有5行命令,這5行用在批處理文件中的多個位置。我無法使用goto,因爲根據這5行創建的錯誤級別,我有不同的操作。我試着將5行放入批處理文件5lines.bat中,但原始批處理文件original.bat僅調用5lines.bat,並且在調用5lines.bat後不執行這些命令):這就是我的original.bat的外觀像:像批處理文件中的函數/方法一樣?

5lines.bat 
echo this gets never called, how to make sure this gets called? 

有沒有退出或5lines.bat這樣的事情!如何確保5lines.bat被調用後的行?

回答

16

配售的可重複使用的功能集成到一個單獨的批處理文件將當然可以模擬一個功能。

問題是,您必須使用call命令才能確保在第二個批處理文件執行完畢後控制權返回給調用者。

call 5lines.bat 
echo this will now get called 
+0

完美,謝謝! – 2012-04-13 23:30:16

56

你可以使用call命令:

call:myDosFunc 

然後定義函數是這樣的:

:myDosFunc - here starts the function 
echo. here the myDosFunc function is executing a group of commands 
echo. it could do a lot of things 
goto:eof 

來源:Batch Functions

+0

謝謝你,call命令是實際上我錯過了。 – 2012-04-13 23:30:57

+0

沒問題!很高興它解決了! – Erwald 2012-04-13 23:33:44

+5

但它是如何工作的? 'goto:eof'有什麼魔力? – Calmarius 2014-11-21 16:26:18

4

你可以嘗試使用上this page

或者列出的例子,你可以把公共線到另一個批處理文件,從主一個

+0

偉大的鏈接! (儘管我最終只是使用call 5lines.bat) – 2012-04-13 23:30:09

1

呼籲有關編寫另一個偉大的教程可重複使用的批處理文件代碼 - 請參見Richie Lawrence's excellent library

+0

鏈接現在已經死亡。 – TLS 2016-10-10 16:39:25

+0

@TLS,謝謝,鏈接已更新 – jwfearn 2016-10-16 15:53:15

7

解決方案:

@ECHO OFF  

call:header Start Some Operation 

... put your business logic here 
... make sure EXIT below is present 
... so you don't run into actual functions without the call 

call:header Operation Finished Successfully 

EXIT /B %ERRORLEVEL% 

:: Functions 

:header 
ECHO ================================================= 
ECHO %* 
ECHO ================================================= 
EXIT /B 0 

重要的是把EXIT/B在每個功能的結束,以及之前函數定義開始,在我的例子是這樣的:

EXIT/B %ERRORLEVEL%

1

這裏有一個「黑客」,這將讓你有在批處理文件"anonymous" functions

@echo off 
setlocal 
set "anonymous=/?" 

:: calling the anonymous function 
call :%%anonymous%% a b c 3>&1 >nul 

:: here the anonymous function is defined 
if "%0" == ":%anonymous%" (
    echo(
    echo Anonymous call: 
    echo %%1=%1 %%2=%2 %%3=%3 
    exit /b 0 
)>&3 
::end of the anonymous function 

匿名功能塊應在調用語句後立即放置,必須與退出聲明結束

的訣竅是,CALL內部使用GOTO,然後返回到其中CALL被執行的行。通過雙重擴展GOTO幫助信息被觸發(使用%%/?%%參數),然後繼續腳本。但是完成後它會返回到CALL - 這就是爲什麼if語句是必需的。

3

只是爲了完整性,還可以將參數傳遞給函數:

函數調用

call :myDosFunc 100 "string val" 

函數體

:myDosFunc 
echo. Got Param#1 %~1 
echo. Got Param#2 %~2 
goto :eof 
相關問題