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

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

   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
echo.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



 

 


 


 

 

 

  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
windows下的dos函数 一)MD——建立子目录   1.功能:创建新的子目录  2.类型:内部命令  3.格式:MD[盘符:][路径名]〈子目录名〉  4.使用说明:  (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前驱动器;  (2)“路径名”:要建立的子目录的上级目录名,若缺省则建在当前目录下。  例:(1)在C盘的根目录下创建名为FOX的子目录;(2)在FOX子目录下再创建USER子目录。  C:、>MD FOX (在当前驱动器C盘下创建子目录FOX)  C:、>MD FOX 、USER (在FOX 子目录下再创建USER子目录)  (二)CD——改变当前目录  1.功能:显示当前目录  2.类型:内部命令  3.格式:CD[盘符:][路径名][子目录名]  4.使用说明:  (1)如果省略路径和子目录名则显示当前目录;  (2)如采用“CD、”格式,则退回到根目录;  (3)如采用“CD.。”格式则退回到上一级目录。  例:(1)进入到USER子目录;(2)从USER子目录退回到子目录;(3)返回到根目录。  C:、>CD FOX 、USER(进入FOX子目录下的USER子目录)  C:、FOX、USER>CD.。 (退回上一级根目录)  C:、FOX>CD、 (返回到根目录)  C:、>  (三)RD——删除子目录命令  1.功能:从指定的磁盘删除了目录。  2.类型:内部命令  3.格式:RD[盘符:][路径名][子目录名]  4.使用说明:  (1)子目录在删除前必须是空的,也就是说需要先进入该子目录,使用DEL(删除文件的命令)将其子目录下的文件删空,然后再退回到上一级目录,用RD命令删除该了目录本身;  (2)不能删除根目录和当前目录。  例:要求把C盘FOX子目录下的USER子目录删除,操作如下:  第一步:先将USER子目录下的文件删空;  C、>DEL C:、FOX、USER、*。*  第二步,删除USER子目录。  C、>RD C:、FOX、USER  (四)DIR——显示磁盘目录命令  1.功能:显示磁盘目录的内容。  2.类型:内部命令  3.格式:DIR [盘符][路径][/P][/W]  4. 使用说明:/P的使用;当欲查看的目录太多,无法在一屏显示完屏幕会一直往上卷,不容易看清,加上/P参数后,屏幕上会分面一次显示23行的文件信息,然后暂停,并提示;Press any key to continue  /W的使用:加上/W只显示文件名,至于文件大小及建立的日期和时间则都省略。加上参数后,每行可以显示五个文件名。  PATH——路径设置命令  1.功能:设备可执行文件的搜索路径,只对文件有效。  2.类型:内部命令  3.格式:PATH[盘符1]目录[路径名1]{[;盘符2:],〈目录路径名2〉…}  4.使用说明:  (1)当运行一个可执行文件时,DOS会先在当前目录中搜索该文件,若找到则运行之;若找不到该文件,则根据PATH命令所设置的路径,顺序逐条地到目录中搜索该文件;  (2)PATH命令中的路径,若有两条以上,各路径之间以一个分号“;”隔开;  (3)PATH命令有三种使用方法:  PATH[盘符1:][路径1][盘符2:][路径2]…(设定可执行文件的搜索路径)  PATH:(取消所有路径)  PATH:(显示目前所设的路径)  (六)TREE——显示磁盘目录结构命令  1.功能:显示指定驱动器上所有目录路径和这些目录下的所有文件名。  2.类型:外部命令  3.格式:TREE[盘符:][/F][》PRN]  4.使用说明:  (1)使用/F参数时显示所有目录及目录下的所有文件,省略时,只显示目录,不显示目录下的文件;  (2)选用>PRN参数时,则把所列目录及目录中的文件名打印输出。  (七)DELTREE——删除整个目录命令  1.功能:将整个目录及其下属子目录和文件删除。  2.类型:外部命令  3.格式:DELTREE[盘符:]〈路径名〉  4.使用说明:该命令可以一步就将目录及其下的所有文件、子目录、更下层的子目录一并删除,而且不管文件的属性为隐藏、系统或只读,只要该文件位于删除的目录之下,DELTREE都一视同仁,照删不误。使用时务必小心!!!  五、磁盘操作类命令  (一)formAT——磁盘格式化命令  1.功能:对磁盘进行格式化,划分磁道和扇区;同时检查出整个磁盘上有无带缺陷的磁道,对坏道加注标记;建立目录区和文件分配表,使磁盘作好接收DOS的准备。  2.类型:外部命令  3.格式:formAT〈盘符:〉[/S][/4][/Q] 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值