2012-04-13 25 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 
相关问题