【DOS批处理】函数定义和用法
来源:互联网 发布:中美网络安全问题 编辑:程序博客网 时间:2024/06/08 05:50
本文主要讲述如下几个问题:
1.什么是函数,怎么创建函数?
2.怎么调用一个函数?
3.函数是怎么工作的?
4.怎么向函数传递参数?
5.函数怎么返回值和返回一个局部变量的值。
一、创建函数(什么是函数)
在batch script 中的函数以一个标签开始,并以goto:eof结束,如下:
script
- :myDosFunc - 函数的开始,用一个标签标识
- echo. 函数体,可以执行很多命令
- echo.
- GOTO:EOF
二、调用函数
Script: 01.
call:myDosFunc
三、函数怎么工作
调用函数的脚本将其分成两部分。
1.main script: 从第一行开始并且以 GOTO:EOF命令结束
2.函数部分:由多个函数组成,由main script调用。
SCRIPT:
- @echo off
- echo.开始调用函数
- call:myDosFunc
- echo.从函数返回myDosFunc
- echo.&pause&goto:eof
- ::--------------------------------------------------------
- ::-- 函数部分开始
- ::--------------------------------------------------------
- :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
三、怎么传递参数,并且在函数中获取参数的值
1.用空格或者逗号将参数分开
2.用双引号将带有空格的字符串参数括起来
- call:myDosFunc 100 YeePEE
- call:myDosFunc 100 "for me"
- call:myDosFunc 100,"for me"
获取参数,采用%1~%9来获取每个参数的值。%0,表示批处理文件本身
- :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
带参数的脚本
- @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
四、函数返回值
1、调用命令不像其他语言那样能有返回值,最常用的做法是在函数中将该值保存在全局变量中,调用结束后
直接用该全局变量。如下:
Usage:
- set "var1=some hopefully not important string"
- echo.var1 before: %var1%
- call:myGetFunc
- echo.var1 after : %var1%
Script:
- :myGetFunc - get a value
- set "var1=DosTips"
- goto:eof
脚本输出如下:
var1 before: some hopefully not important string
var1 after : DosTips
2、通过引用返回值,调用者通过传递一个变量给函数来存储返回值
Usage:
- call:myGetFunc var1
- cho.var1 after : %var1%
Script:
- :myGetFunc - passing a variable by reference
- set "%~1=DosTips"
- goto:eof
脚本输出如下:
var1 after : DosTips
完整脚本:
- @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
五、函数的局部变量
怎么保证局部变量和全局变量不冲突,SETLOCAL命令能让处理器当做是局部变量,用ENDLOCAL解除局部变量。
ENDLOCAL 会被自动调用,当批处理执行到文件末尾的时候,即GOTO:EOF。SETLOCAL可以很好的保护函数内与外面的变量不会冲突。
- @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
脚本输出:
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命令。
- @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
脚本输出:
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数列。
- @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
七、总结,定义一个标准的dos batch script function
- :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
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 【DOS批处理】函数定义和用法
- 【DOS批处理】函数定义和用法
- 【DOS批处理】函数定义和用法
- 【DOS批处理】函数定义和用法
- 批处理定义和调用函数
- dos批处理 for用法
- DOS BAT批处理定义变量
- dos下 和 批处理中的 for 语句的基本用法
- dos下 和 批处理中的 for 语句的基本用法
- dos下 和 批处理中的 for 语句的基本用法
- dos下 和 批处理中的 for 语句的用法详解
- dos下和批处理中的for语句的基本用法
- dos和批处理命令
- dos命令 和 批处理
- dos命令 和 批处理
- DOS批处理中的FORFILES用法
- DOS批处理中%~dp0用法说明
- GetCurrentDirectory等文件夹操作函数 && MessageBox信息函数 && VC应用执行DOS命令和批处理
- 如何办理提前还贷
- hdu 5122(K.Bro Sorting, 简单思维题)
- 企业级证书打包下载安装之后无法使用问题
- Java读取ini文件和中文乱码问题解决
- Hibernate与 MyBatis的比较
- 【DOS批处理】函数定义和用法
- HQL 表连接
- Nosql简介
- bootstrap学习教程
- 我很笨
- iOS 如何面试
- 少年啊,来一发昆特吗(三)——昆特牌的选择界面
- 位运算
- iOS9.0更新放弃AlertView后,开始使用UIAlertController