DOS批处理 - 函数教程

DOS Batch - Function Tutorial

What it is, why it`s important and how to write your own.

Description:The assumption is: A batch script snippet can be named a function when:
  1. ... it has a callable entrance point.
  2. ... on completion execution continues right after the command that initially called the function.
  3. ... it works the same no matter from where it`s being called, even when it calls itself recursively.
  4. ... the variables used within a function do not conflict with variables outside the function.
  5. ... it exchanges data with the calling code strictly through input and output variables or a return code.
The benefits behind functions are:
  1. Keep the main script clean
  2. Hide complexity in reusable functions
  3. Test functions independently from the main script
  4. Add more functionality to your batch script simply by adding more functions at the bottom
  5. Don`t worry about the function implementation, just test it and use it

 


TOP
2008-01-01

Create a Function - What is a function

Description:In DOS you write a function by surrounding a group of command by a label and a GOTO:EOF command. A single batch file can contain multiple functions defined like this. The label becomes the function name.
Script:
01.
02.
03.
04.
:myDosFunc    - here starts my function identified by it`s label
echo. here the myDosFunc function is executing a group of commands
echo. it could do a lot of things
GOTO:EOF

TOP
2008-01-01

Call a Function - How to invoke a function

Description:A function can be called with the CALL command followed by the function label.
Script:
01.
call:myDosFunc

TOP
2008-01-01

Example - Calling a Function - An Example showing how it works

Description:The use of batch functions will divide the script into two sections.
  1. The main script: starting at line 1 ending with a GOTO:EOF command that terminates the script.
  2. The function section: filling the second half of the batch file with one or more functions to be callable from the main script.
Script:Download: BatchTutoFunc1.bat  
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
@echo off

echo.going to execute myDosFunc
call:myDosFunc
echo.returned from myDosFunc

echo.&pause&goto:eof

::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:myDosFunc    - here starts my function identified by it`s label
echo.  here the myDosFunc function is executing a group of commands
echo.  it could do a lot of things
goto:eof
Script Output:
 DOS Script Output
going to execute myDosFunc
  here the myDosFunc function is executing a group of commands
  it could do a lot of things
returned from myDosFunc
 
Press any key to continue . . . 

TOP
2008-01-01

Passing Function Arguments - How to pass arguments to the function

Description:Just as the DOS batch file itself can have arguments, a function can be called with arguments in a similar way. Just list all arguments after the function name in the call command.
Use a space or a comma to separate arguments.
Use double quotes for string arguments with spaces.
Script:
01.
02.
03.
call:myDosFunc 100 YeePEE
call:myDosFunc 100 "for me"
call:myDosFunc 100,"for me"

TOP
2008-01-01

Parsing Function Arguments - How to retrieve function arguments within the function

Description:Just as the DOS batch file itself retrieves arguments via %1 ⦠%9 a function can parse it`s arguments the same way. The same rules apply.
Let`s modify our previews example to use arguments.
To strip of the double quotes in an arguments value the tilde modifier, i.e. use %~2 instead of %2.
Script:
01.
02.
03.
04.
05.
:myDosFunc    - here starts myDosFunc identified by it`s label
echo.
echo. here the myDosFunc function is executing a group of commands
echo. it could do %~1 of things %~2.
goto:eof

TOP
2008-01-01

Example - Function with Arguments - An Example showing how it works

Description:The following example demonstrates how to pass arguments into a DOS function. The :myDosFunc function is being called multiple times with different arguments.

Note: The last call to myDosFunc doesn`t use double quotes for the second argument. Subsequently "for" and "me" will be handled as two separate arguments, whereas the third argument "me" is not being used within the function.
Script:Download: BatchTutoFunc2.bat  
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
@echo off

echo.going to execute myDosFunc with different arguments
call:myDosFunc 100 YeePEE
call:myDosFunc 100 "for me"
call:myDosFunc 100,"for me"
call:myDosFunc 100,for me

echo.&pause&goto:eof


::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:myDosFunc    - here starts my function identified by it's label
echo.
echo. here the myDosFunc function is executing a group of commands
echo. it could do %~1 of things %~2.
goto:eof
Script Output:
 DOS Script Output
going to execute myDosFunc with different arguments
 
 here the myDosFunc function is executing a group of commands
 it could do 100 of things YeePEE.
 
 here the myDosFunc function is executing a group of commands
 it could do 100 of things for me.
 
 here the myDosFunc function is executing a group of commands
 it could do 100 of things for me.
 
 here the myDosFunc function is executing a group of commands
 it could do 100 of things for.
 
Press any key to continue . . . 

TOP
2008-01-01

Returning Values the Classic Way - The classic way of returning values and the limitations

Description:The CALL command doesn`t support return values as known by other programming languages.
The classic walkaround is to have the function store the return value into a environment variable. The calling script can use this variable when the function returns. The :myGetFunc function below demonstrates how the variable var1 gets the "DosTips" string assigned which can then be used in the calling function.

Note: The var1 variable is reserved for this particular function. Any data stored in var1 by the calling function before calling :myGetVar will be overwritten.
Usage:
01.
02.
03.
04.
set "var1=some hopefully not important string"
echo.var1 before: %var1%
call:myGetFunc
echo.var1 after : %var1%
Script:
01.
02.
03.
:myGetFunc    - get a value
set "var1=DosTips"
goto:eof
Script Output:
 DOS Script Output
var1 before: some hopefully not important string
var1 after : DosTips

TOP
2008-01-01

Returning Values via References - Let the caller determine how to return the function result and avoid the need of dedicated variables

Description:Instead of using "global" variables for return value, the function can use one of it`s arguments as variable reference. The caller can then pass a variable name to the function and the function can store the result into this variable making use of the command line expansion of the command processor:

Note: The var1 variable is not reserved for this articular function. Any variable can be passed to the function the caller has full control.
Usage:
01.
02.
call:myGetFunc var1
echo.var1 after : %var1%
Script:
01.
02.
03.
:myGetFunc    - passing a variable by reference
set "%~1=DosTips"
goto:eof
Script Output:
 DOS Script Output
var1 after : DosTips

TOP
2008-01-01

Example - Returning Values using Variable Reference - An Example showing how it works

Description:This code shows how the var1 variable is being passed into a :myGetFunc function simply by passing the variable name. Within the :myGetFunc function the command processor works like this:
  1. Reads the set command into memory: set "%~1=DosTips"
  2. Expand the variables, i.e. %~1 like this: set "var1=DosTips"
  3. Finally execute the command and assign the new string to var1
Script:Download: BatchTutoFunc3.bat  
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
@echo off

set "var1=CmdTips"
echo.var1 before: %var1%
call:myGetFunc var1
echo.var1 after : %var1%

echo.&pause&goto:eof


::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:myGetFunc    - passing a variable by reference
set "%~1=DosTips"
goto:eof
Script Output:
 DOS Script Output
var1 before: CmdTips
var1 after : DosTips
 
Press any key to continue . . . 

TOP
2008-01-01

Local Variables in Functions - How to avoid name conflicts and keep variable changes local to the function

Description:The SETLOCAL causes the command processor to backup all environment variables. The variables can be restored by calling ENDLOCAL. Changes made im between are local to the current batch. ENDLOCAL is automatically being called when the end of the batch file is reached, i.e. by calling GOTO:EOF.
Localizing variables with SETLOCAL allows using variable names within a function freely without worrying about name conflicts with variables used outside the function.
Script:Download: BatchTutoFunc4.bat  
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
@echo off

set "aStr=Expect no changed, even if used in function"
set "var1=No change for this one.  Now what?"
echo.aStr before: %aStr%
echo.var1 before: %var1%
call:myGetFunc var1
echo.aStr after : %aStr%
echo.var1 after : %var1%

echo.&pause&goto:eof

::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:myGetFunc    - passing a variable by reference
SETLOCAL
set "aStr=DosTips"
set "%~1=%aStr%"
ENDLOCAL
goto:eof
Script Output:
 DOS Script Output
aStr before: Expect no changed, even if used in function
var1 before: No change for this one.  Now what?
aStr after : Expect no changed, even if used in function
var1 after : No change for this one.  Now what?
 
Press any key to continue . . . 

TOP
2008-01-01

Returning Local Variables - How to pass return values over the ENDLOCAL barrier

Description:The question is: When localizing a function via SETLOCAL and ENDLOCAL, how to return a value that was calculated before executing ENDLOCAL when ENDLOCAL restores all variables back to its original state?
The answer comes with "variable expansion". The command processor expands all variables of a command before executing the command. Letting the command processor executing ENDLOCAL and a SET command at once solves the problem. Commands can be grouped within brackets.
Script:Download: BatchTutoFunc5.bat  
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
@echo off

set "aStr=Expect no changed, even if used in function"
set "var1=Expect changed"
echo.aStr before: %aStr%
echo.var1 before: %var1%
call:myGetFunc var1
echo.aStr after : %aStr%
echo.var1 after : %var1%

echo.&pause&goto:eof

::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:myGetFunc    - passing a variable by reference
SETLOCAL
set "aStr=DosTips"
( ENDLOCAL
    set "%~1=%aStr%"
)
goto:eof

:myGetFunc2    - passing a variable by reference
SETLOCAL
set "aStr=DosTips"
ENDLOCAL&set "%~1=%aStr%"       &rem THIS ALSO WORKS FINE
goto:eof
Script Output:
 DOS Script Output
aStr before: Expect no changed, even if used in function
var1 before: Expect changed
aStr after : Expect no changed, even if used in function
var1 after : DosTips
 
Press any key to continue . . . 

TOP
2008-01-01

Recursive Functions - Tadaaah!!!

Description:Being able to completely encapsulate the body of a function by keeping variable changes local to the function and invisible to the caller we are now able to call a function recursively making sure each level of recursion works with its own set of variables even thought variable names are being reused.

Example: The next example below shows how to calculate a Fibonacci number recursively. The recursion stops when the Fibonacci algorism reaches a number greater or equal to a given input number.
The example starts with the numbers 0 and 1 the :myFibo function calls itself recursively to calculate the next Fibonacci number until it finds the Fibonacci number greater or equal 1000000000.

The first argument of the myFibo function is the name of the variable to store the output in. This variable must be initialized to the Fibonacci number to start with and will be used as current Fibonacci number when calling the function and will be set to the subsequent Fibonacci number when the function returns.
Script:Download: BatchTutoFuncRecurs.bat  
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
@echo off

set "fst=0"
set "fib=1"
set "limit=1000000000"
call:myFibo fib,%fst%,%limit%
echo.The next Fibonacci number greater or equal %limit% is %fib%.

echo.&pause&goto:eof


::--------------------------------------------------------
::-- Function section starts below here
::--------------------------------------------------------

:myFibo  -- calculate recursively the next Fibonacci number greater or equal to a limit
::       -- %~1: return variable reference and current Fibonacci number
::       -- %~2: previous value
::       -- %~3: limit
SETLOCAL
set /a "Number1=%~1"
set /a "Number2=%~2"
set /a "Limit=%~3"
set /a "NumberN=Number1 + Number2"
if /i %NumberN% LSS %Limit% call:myFibo NumberN,%Number1%,%Limit%
(ENDLOCAL
    IF "%~1" NEQ "" SET "%~1=%NumberN%"
)
goto:eof
Script Output:
 DOS Script Output
The next Fibonacci number greater or equal 1000000000 is 1134903170.
 
Press any key to continue . . . 

TOP
2008-01-01

Summary - Defining a standard format for a DOS batch function

Description:With the information learned in this section we can define a standard format for a DOS batch functions as shown below.
Also check out the rich set of ready to use DOS functions provided by the DosTips.com function library.
Script:Download: BatchFunctionTmpl.bat
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
:myFunctionName    -- function description here
::                 -- %~1: argument description here
SETLOCAL
REM.--function body here
set LocalVar1=...
set LocalVar2=...
(ENDLOCAL & REM -- RETURN VALUES
    IF "%~1" NEQ "" SET %~1=%LocalVar1%
    IF "%~2" NEQ "" SET %~2=%LocalVar2%
)
GOTO:EOF

出处:http://www.dostips.com/DtTutoFunctions.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DOS批处理是一种在DOS操作系统下运行的脚本语言,用于批量执行命令和控制计算机的行为。在DOS批处理高级教程精选合编中,我们汇集了一些高级的技巧和技术,帮助读者更好地学习和应用DOS批处理。 首先,我们介绍了DOS批处理的基本知识和语法,包括如何编写和运行批处理脚本,如何使用变量和参数,以及如何进行条件判断和循环控制。这为读者打下了批处理编程的基础。 然后,我们深入探讨了DOS批处理中的高级技巧和命令。我们介绍了如何使用各种内置命令和外部工具,如文件操作、目录管理、系统配置等。我们还介绍了如何处理文本文件、运行其他程序、创建自定义函数等高级技术,使读者能够更加灵活地应用DOS批处理。 在教程中,我们还提供了一些实用的示例和案例分析,帮助读者理解和应用所学的知识。这些案例涵盖了各种常见场景,如批量重命名文件、自动化备份数据、日志文件的处理等。读者可以通过学习这些案例,将理论知识转化为实际应用能力。 此外,我们还介绍了一些常见问题和解决方案,帮助读者避免一些常见的错误和陷阱。我们探讨了DOS批处理的性能优化、错误处理、调试技巧等方面的内容,让读者能够更好地应对和解决实际问题。 综上所述,DOS批处理高级教程精选合编为读者提供了一套系统、全面的学习资料,帮助读者成为DOS批处理的高级编程专家。无论是初学者还是有一定经验的开发人员,都能从中获得丰富的知识和技巧,提升自己的技术水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值