本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。
0x00 批处理(Batch)参数传递
描述: 在批处理可执行文件中,参数变量可以从%0 ~ %9,其中%0表示批处理命令本身,其它参数字符串分别用%1到%9顺序表示,这有点象编程中的实参和形参的关系(即%1
是形参而可执行bat文件.BAT
是实参),在进行参数传递时通常会在批处理文件名后加的以空格(或者Tab)分隔的字符串。
温馨提示: Windows Batch 批处理系列教程示例脚本可访问作者Github仓库中DevelopLearnig的项目,✈直达-> https://github.com/WeiyiGeek/DevelopLearnig/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 /1
而SHIFT /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
参数。
:: 转义模式错误的演示, 上述将 �% 传递 %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