亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > BAT > 正文

DOS批處理 函數定義與用法

2020-03-29 19:56:03
字體:
來源:轉載
供稿:網友

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
 
Create a Function What is a function?
Call a Function How to invoke a function?
Example - Calling a Function An Example showing how it works.
Passing Function Arguments How to pass arguments to the function?
Parsing Function Arguments How to retrieve function arguments within the function?
Example - Function with Arguments An Example showing how it works.
Returning Values the Classic Way The classic way of returning values and the limitations.
Returning Values via References Let the caller determine how to return the function result and avoid the need of dedicated variables.
Example - Returning Values using Variable Reference An Example showing how it works.
Local Variables in Functions How to avoid name conflicts and keep variable changes local to the function?
Returning Local Variables How to pass return values over the ENDLOCAL barrier?
Recursive Functions Tadaaah!!!
Summary Defining a standard format for a DOS batch function
DOS Batch - Function Tutorial What it is, why it`s important and how to write your own.

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:

 

復制代碼 代碼如下:

: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

 

 

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

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:

 

復制代碼 代碼如下:

@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:   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 . . .
 
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:

 

 

復制代碼 代碼如下:

call:myDosFunc 100 YeePEE
call:myDosFunc 100 "for me"
call:myDosFunc 100,"for me"

 
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:

 

 

復制代碼 代碼如下:

 :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

 
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:

復制代碼 代碼如下:

 @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:   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 . . .
 

 

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:

 

復制代碼 代碼如下:

 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

 
Script Output:   Script Output 
var1 before: some hopefully not important string
var1 after : DosTips
 
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:

 

復制代碼 代碼如下:

 call:myGetFunc var1
echo.var1 after : %var1%

 
Script:

 

 

復制代碼 代碼如下:

 :myGetFunc    - passing a variable by reference
set "%~1=DosTips"
goto:eof

 
Script Output:   Script Output 
var1 after : DosTips
 
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:

 

 

復制代碼 代碼如下:

 @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:   Script Output 
var1 before: CmdTips
var1 after : DosTips
 
Press any key to continue . . .
 

 

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:

 

復制代碼 代碼如下:

 @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:   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 . . .
 
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:

 

 

復制代碼 代碼如下:

 @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:   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 . . .

 

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 ss 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:

 

復制代碼 代碼如下:

 @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:   Script Output 
The next Fibonacci number greater or equal 1000000000 is 1134903170.
 
Press any key to continue . . .
 
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:

 

 

復制代碼 代碼如下:

 :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

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区欧美二区三区| 欧美片一区二区三区| 亚洲欧美激情视频| 国产精品美女无圣光视频| 国产网站欧美日韩免费精品在线观看| 亚洲精品国产综合区久久久久久久| xxx成人少妇69| 午夜精品久久久久久久99热浪潮| 亚洲精品一区二区在线| 国产精品久久婷婷六月丁香| 亚洲国产91色在线| 国模精品视频一区二区| 精品露脸国产偷人在视频| 亚洲精品自拍偷拍| 久久69精品久久久久久国产越南| 国产一区二区久久精品| 久久久91精品国产一区不卡| 久久精品国产精品亚洲| 欧美最猛性xxxxx(亚洲精品)| 91社影院在线观看| 亚洲欧美日韩一区在线| 欧美日韩国内自拍| 欧美色xxxx| 国产91精品高潮白浆喷水| 久久久成人精品视频| 亚洲国产精品专区久久| 在线日韩中文字幕| www.欧美三级电影.com| 久久精品影视伊人网| 亚洲最大av网站| 久久精品久久久久久国产 免费| 成人日韩av在线| 欧美激情综合亚洲一二区| 国产美女高潮久久白浆| 久久人人爽人人爽爽久久| 午夜精品www| 日韩美女免费观看| 91在线精品播放| 91在线直播亚洲| 日韩欧美aaa| 国产精品久久久久影院日本| 91成人在线播放| 欧美性生活大片免费观看网址| 久久影视电视剧免费网站清宫辞电视| 在线播放日韩欧美| 91av在线网站| 91av在线视频观看| 奇米一区二区三区四区久久| 国产精品老女人精品视频| 国产成人av网| 国产欧美在线观看| 91精品久久久久久综合乱菊| 国产精品视频1区| 亚洲激情视频在线| 欧美天堂在线观看| 亚洲精品91美女久久久久久久| 精品久久久久久久中文字幕| 亚洲色图17p| 欧美激情一区二区三区高清视频| 欧美中文在线免费| 日韩成人免费视频| 成人中心免费视频| 国产91在线播放精品91| 久久国产精品偷| 久久久亚洲国产天美传媒修理工| 欧美自拍视频在线观看| 欧美多人乱p欧美4p久久| 美女999久久久精品视频| 欧洲亚洲免费视频| 26uuu亚洲伊人春色| 亚洲精品久久久久久久久| 日韩成人激情影院| 97在线精品国自产拍中文| 欧美贵妇videos办公室| 91精品国产综合久久香蕉922| 欧美成年人在线观看| 亚洲精品中文字幕有码专区| 亚洲国产91色在线| 亚洲精品美女久久久久| 45www国产精品网站| 亚洲免费电影在线观看| 国产精品99久久久久久白浆小说| 欧美性生活大片免费观看网址| 亚洲国产欧美久久| 午夜精品在线视频| 成人观看高清在线观看免费| 久久亚洲精品中文字幕冲田杏梨| 91精品久久久久久久久久另类| 久久久久久久久久国产| 精品国产乱码久久久久久虫虫漫画| 琪琪亚洲精品午夜在线| 亚洲视频国产视频| 欧美高跟鞋交xxxxxhd| 亚洲国产成人久久综合一区| 亚洲一区二区三区四区在线播放| 国产成人福利视频| 国产手机视频精品| 热草久综合在线| 国产精品啪视频| 中文精品99久久国产香蕉| 久久福利网址导航| 午夜精品免费视频| 国产精品美女久久久久久免费| 久久久久国产精品一区| 欧美劲爆第一页| 欧美综合激情网| 日韩中文字幕在线看| 一区二区在线免费视频| 在线视频中文亚洲| 日韩av中文字幕在线播放| 91成人在线观看国产| 久久久亚洲影院你懂的| 欧美午夜视频一区二区| 国产不卡视频在线| 亚洲最大福利视频| 亚洲国产成人av在线| 日本久久91av| 91国在线精品国内播放| 国产日韩欧美中文在线播放| 欧美激情性做爰免费视频| 中文字幕亚洲色图| 亚洲国产精彩中文乱码av在线播放| 亚洲乱码一区av黑人高潮| 国产偷亚洲偷欧美偷精品| 欧美精品18videos性欧美| 不卡av日日日| 成人国产精品一区| 欧美大尺度在线观看| 亚洲欧美另类在线观看| 另类色图亚洲色图| 国产精品一区久久| 91亚洲国产成人久久精品网站| 中文字幕自拍vr一区二区三区| 北条麻妃一区二区三区中文字幕| 久久在精品线影院精品国产| 国产精品视频一| 日韩在线观看免费av| 国产精品久久999| 久久久久久久激情视频| 国产97在线播放| 欧美电影院免费观看| 欧美性猛交xxxx乱大交蜜桃| 亚洲视频在线免费看| 日韩中文在线视频| 97超级碰碰人国产在线观看| 亚洲精品免费av| 国产欧美日韩高清| 九九热精品视频| 国产精品专区第二| 国模视频一区二区三区| 久久精品视频中文字幕| 欧美色视频日本高清在线观看| 亚洲精品成人久久电影| 国产丝袜视频一区| 日韩在线观看av| 日韩中文字幕在线观看| 国产在线视频欧美| 国内精久久久久久久久久人| 久久综合伊人77777| 国产欧美日韩中文字幕| 国产成人亚洲综合青青| 成人午夜在线视频一区| 亚洲直播在线一区| 国产情人节一区|