【DOS批处理】函数定义和用法

来源:互联网 发布:中美网络安全问题 编辑:程序博客网 时间:2024/06/08 05:50

 本文主要讲述如下几个问题:

   1.什么是函数,怎么创建函数?

   2.怎么调用一个函数?

   3.函数是怎么工作的?

   4.怎么向函数传递参数?

   5.函数怎么返回值和返回一个局部变量的值。

一、创建函数(什么是函数)

    在batch script 中的函数以一个标签开始,并以goto:eof结束,如下:

 script

[plain] view plaincopy
  1. :myDosFunc    - 函数的开始,用一个标签标识  
  2. echo. 函数体,可以执行很多命令  
  3. echo.   
  4. GOTO:EOF  

二、调用函数

Script: 01.
 call:myDosFunc

 

三、函数怎么工作

  调用函数的脚本将其分成两部分。

    1.main script: 从第一行开始并且以 GOTO:EOF命令结束

    2.函数部分:由多个函数组成,由main script调用。

   

   SCRIPT:

[plain] view plaincopy
  1. @echo off  
  2. echo.开始调用函数  
  3. call:myDosFunc  
  4. echo.从函数返回myDosFunc  
  5. echo.&pause&goto:eof  
  6. ::--------------------------------------------------------  
  7. ::-- 函数部分开始  
  8. ::--------------------------------------------------------  
  9. :myDosFunc    - here starts my function identified by it`s label  
  10. echo.  here the myDosFunc function is executing a group of commands  
  11. echo.  it could do a lot of things  
  12. goto:eof  


 

三、怎么传递参数,并且在函数中获取参数的值

   1.用空格或者逗号将参数分开

   2.用双引号将带有空格的字符串参数括起来

[plain] view plaincopy
  1. call:myDosFunc 100 YeePEE  
  2. call:myDosFunc 100 "for me"  
  3. call:myDosFunc 100,"for me"  

 

   获取参数,采用%1~%9来获取每个参数的值。%0,表示批处理文件本身

[plain] view plaincopy
  1.  :myDosFunc    - here starts myDosFunc identified by it`s label  
  2. echo.  
  3. echo. here the myDosFunc function is executing a group of commands  
  4. echo. it could do %~1 of things %~2.  
  5. goto:eof  

 

 带参数的脚本

[plain] view plaincopy
  1.  @echo off  
  2. echo.going to execute myDosFunc with different arguments  
  3. call:myDosFunc 100 YeePEE  
  4. call:myDosFunc 100 "for me"  
  5. call:myDosFunc 100,"for me"  
  6. call:myDosFunc 100,for me  
  7. echo.&pause&goto:eof  
  8. ::--------------------------------------------------------  
  9. ::-- Function section starts below here  
  10. ::--------------------------------------------------------  
  11. :myDosFunc    - here starts my function identified by it's label  
  12. echo.  
  13. echo. here the myDosFunc function is executing a group of commands  
  14. echo. it could do %~1 of things %~2.  
  15. goto:eof  


四、函数返回值

    
   1、调用命令不像其他语言那样能有返回值,最常用的做法是在函数中将该值保存在全局变量中,调用结束后

直接用该全局变量。如下:

  Usage:

[plain] view plaincopy
  1.  set "var1=some hopefully not important string"  
  2. echo.var1 before: %var1%  
  3. call:myGetFunc  
  4. echo.var1 after : %var1%  

Script:

[plain] view plaincopy
  1.  :myGetFunc    - get a value  
  2. set "var1=DosTips"  
  3. goto:eof  

 

脚本输出如下:

var1 before: some hopefully not important string
var1 after : DosTips

  2、通过引用返回值,调用者通过传递一个变量给函数来存储返回值

Usage:

[plain] view plaincopy
  1. call:myGetFunc var1  
  2. cho.var1 after : %var1%  

 

Script:

[plain] view plaincopy
  1.  :myGetFunc    - passing a variable by reference  
  2. set "%~1=DosTips"  
  3. goto:eof  

脚本输出如下:

var1 after : DosTips
 

完整脚本:

[plain] view plaincopy
  1.  @echo off  
  2. set "var1=CmdTips"  
  3. echo.var1 before: %var1%  
  4. call:myGetFunc var1  
  5. echo.var1 after : %var1%  
  6. echo.&pause&goto:eof  
  7.   
  8. ::--------------------------------------------------------  
  9. ::-- Function section starts below here  
  10. ::--------------------------------------------------------  
  11. :myGetFunc    - passing a variable by reference  
  12. set "%~1=DosTips"  
  13. goto:eof  


五、函数的局部变量

   怎么保证局部变量和全局变量不冲突,SETLOCAL命令能让处理器当做是局部变量,用ENDLOCAL解除局部变量。

ENDLOCAL 会被自动调用,当批处理执行到文件末尾的时候,即GOTO:EOF。SETLOCAL可以很好的保护函数内与外面的变量不会冲突。

 

[plain] view plaincopy
  1.  @echo off  
  2. set "aStr=Expect no changed, even if used in function"  
  3. set "var1=No change for this one.  Now what?"  
  4. echo.aStr before: %aStr%  
  5. echo.var1 before: %var1%  
  6. call:myGetFunc var1  
  7. echo.aStr after : %aStr%  
  8. echo.var1 after : %var1%  
  9. echo.&pause&goto:eof  
  10. ::--------------------------------------------------------  
  11. ::-- Function section starts below here  
  12. ::--------------------------------------------------------  
  13. :myGetFunc    - passing a variable by reference  
  14. SETLOCAL  
  15. set "aStr=DosTips"  
  16. set "%~1=%aStr%"  
  17. ENDLOCAL  
  18. goto:eof  

 

脚本输出:

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?

   返回局部变量

      ----怎么跳过ENDLOCAL的屏障,返回局部变量值?

   采用”变量扩充“,在SETLOCAL与ENDLOCAL之间的全局变量的值会备份,当退出ENDLOCAL,该值将恢复。让命令处理器来执行ENDLOCAL 和SET命令。

 

[plain] view plaincopy
  1.  @echo off  
  2. set "aStr=Expect no changed, even if used in function"  
  3. set "var1=Expect changed"  
  4. echo.aStr before: %aStr%  
  5. echo.var1 before: %var1%  
  6. call:myGetFunc var1  
  7. echo.aStr after : %aStr%  
  8. echo.var1 after : %var1%  
  9. echo.&pause&goto:eof  
  10. ::--------------------------------------------------------  
  11. ::-- Function section starts below here  
  12. ::--------------------------------------------------------  
  13. :myGetFunc    - passing a variable by reference  
  14. SETLOCAL  
  15. set "aStr=DosTips"  
  16. ( ENDLOCAL  
  17.     set "%~1=%aStr%"  
  18. )  
  19. goto:eof  
  20. :myGetFunc2    - passing a variable by reference  
  21. SETLOCAL  
  22. set "aStr=DosTips"  
  23. ENDLOCAL&set "%~1=%aStr%"       &rem THIS ALSO WORKS FINE  
  24. goto:eof  



脚本输出:

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

六、编写递归函数

     让函数局部变量的变换对调用者是可见的,循环调用函数,让变量可重用。下面编写一个函数计算Fibonacci数列。

[plain] view plaincopy
  1.  @echo off  
  2. set "fst=0"  
  3. set "fib=1"  
  4. set "limit=1000000000"  
  5. call:myFibo fib,%fst%,%limit%  
  6. echo.The next Fibonacci number greater or equal %limit% is %fib%.  
  7. echo.&pause&goto:eof  
  8.   
  9. ::--------------------------------------------------------  
  10. ::-- Function section starts below here  
  11. ::--------------------------------------------------------  
  12. :myFibo  -- calculate recursively the next Fibonacci number greater or equal to a limit  
  13. ::       -- %~1: return variable reference and current Fibonacci number  
  14. ::       -- %~2: previous value  
  15. ::       -- %~3: limit  
  16. SETLOCAL  
  17. set /a "Number1=%~1"  
  18. set /a "Number2=%~2"  
  19. set /a "Limit=%~3"  
  20. set /a "NumberN=Number1 + Number2"  
  21. if /i %NumberN% LSS %Limit% call:myFibo NumberN,%Number1%,%Limit%  
  22. (ENDLOCAL  
  23.     IF "%~1" NEQ "" SET "%~1=%NumberN%"  
  24. )  
  25. goto:eof  

 

七、总结,定义一个标准的dos batch script function

 

[plain] view plaincopy
  1.  :myFunctionName    -- function description here  
  2. ::                 -- %~1: argument description here  
  3. SETLOCAL  
  4. REM.--function body here  
  5. set LocalVar1=...  
  6. set LocalVar2=...  
  7. (ENDLOCAL & REM -- RETURN VALUES  
  8.     IF "%~1" NEQ "" SET %~1=%LocalVar1%  
  9.     IF "%~2" NEQ "" SET %~2=%LocalVar2%  
  10. )  
  11. GOTO:EOF  

版权声明:本文为博主原创文章,未经博主允许不得转载。

0 0
原创粉丝点击