运维必学 | 函数参数传递-从零开始学Windows批处理(Batch)编程系列教程

2023-10-31 17:19:16 浏览数 (1)

本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。

0x00 批处理(Batch)参数传递

描述: 在批处理可执行文件中,参数变量可以从%0 ~ %9,其中%0表示批处理命令本身,其它参数字符串分别用%1到%9顺序表示,这有点象编程中的实参和形参的关系(即%1是形参而可执行bat文件.BAT是实参),在进行参数传递时通常会在批处理文件名后加的以空格(或者Tab)分隔的字符串。

温馨提示: Windows Batch 批处理系列教程示例脚本可访问作者Github仓库中DevelopLearnig的项目,✈直达-> https://github.com/WeiyiGeek/De‍velopLearnig/tree/main/TerminalScript/bat

1.常规参数传递

描述: 通常情况下如果我们批处理.bat脚本,若想从命令行接收参数,可以使用%0~%9的位置变量。

示例演示:

代码语言:javascript复制
@echo off
:: 批处理接收命令行参数的传递演示
set a=%0
echo 当前执行文件:%a%
set b=%1
set c=%2
echo 参数1:%a% ,参数2:%c%
:: 将顺序地显示参数1和参数2的文件内容
type %1
type %2
pause

执行结果:

2.使用shift参数移位

Q: 现在问题来了万一有10个及以上参数怎么办?

答案肯定是有的,例如有一种方法就是采用Shift 命令进行参数的移位!!

使用 shift 命令更改批处理文件中可替换参数的位置,每执行一次则向下位移一个参数,例如SHIFT = SHIFT /1SHIFT /2则是将从第二位开始向前移位(1),即会将 %3 移位到 %2,将 %4 移位到 %3, 以此类推但是并且不影响 %0 和 %1。 !

示例1.

代码语言:javascript复制
@echo off
::10.MoreArgument.bat 1 2 3 4 5 6 7 8 9 a b c d e f
::shift
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /0 
:: 前移移位即 %2 => %1
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /1  
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /2
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /3
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /4
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /5
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /6
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /7
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
shift /8
echo   %1 %2 %3 %4 %5 %6 %7 %8 %9
pause 1>nul

示例2.

代码语言:javascript复制
@echo od
:: 下面则直接是 %1 然后从 %3 -> %2的位置 , 后面的参数都向前-1
shift /2
echo  %1 %2 %3 %4 %5 %6 %7 %8 %9

执行效果:

示例3.

代码语言:javascript复制
@echo off
::参数的传递演示
set a=%0
echo 执行文件:%a%
set a=%1
echo Argumnent1:%a%
echo ""

:: 采用Shift的方式
:: 从第九个参数-1, 从而 $10 -> $9 并且不影响前的 0-8 的参数
shift /8
echo "第10个参数为"=%9

执行效果:

温馨提示: 如需处理命令行上9个以上的参数, 亦可以使用for命令组合%*来完成, 例如for %a in (%*) do echo %a


偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。


0x01 批处理(Batch)函数定义与返回值

1.函数定义

描述: 在批处理中也是可以定义函数,只不过与常规方式编程方式不同,其使用:加上以字母开头的名称,组成一个使用goto命令跳转的一个片段脚本,注意在使用批处理的处理顺序是从上到小,所以在执行的时候也需要将函数调用放在前面。

示例演示:

代码语言:javascript复制
@echo off
:: 批处理函数定义与使用

: 函数调用
goto pre

:start
echo "start 函数: 访问【全栈工程师修炼指南】公众号"
goto end

:view
echo "view 函数:正在浏览 https://weiyigeek.top"
goto end 

:pre
echo "pre 函数:正在准备程序运行前的准备"
goto start

:end
(echo "end 函数: 程序停止" )

执行结果:

代码语言:javascript复制
Y:DevelopLearnigTerminalScriptBatDay02>3.function.bat
"pre 函数:正在准备程序运行前的准备"
"start 函数: 访问【全栈工程师修炼指南】公众号"
"end 函数: 程序停止"

2.使用call为子函数传递参数

描述: 在批处理中预定的变量之前是不可以被扩充,但我们可以通过call命令将aa作为参数传递给子元素。

例如,下述定义了一个子函数deal,我们将aa变量转换成了变量%1,即符合%x格式,从而可以进行字符串扩充。

示例演示:

代码语言:javascript复制
@echo off
set aa=C:WindowsPPPa.btx
:: call可以传递参数给子函数
call :deal aaa �% "c c" ddd eee
pause > nul
:deal
echo %%0 = %0
echo %%1 = %1
:: 变量也可以传递参数
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5

温馨提示: 上述示例必须采用%%1来输出"%1"字符串,而不用^来转义%,否则就会理解成为%1参数。

代码语言:javascript复制
:: 转义模式错误的演示, 上述将 �% 传递 %2 变量。

echo ^%%2 = %2  
:: True 上面%%1形式相同
:: %2 = C:WindowsPPPa.btx

echo ^%2 = %2   
:: Error
:: C:WindowsPPPa.btx =  C:WindowsPPPa.btx

本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/2023/6-28-755.html

0 人点赞