参考来源:
DOS:变量嵌套和命令嵌套 - 阿飞同学 - 博客园
bat脚本的基本命令语法 - 整合侠 - 博客园
一、什么是变量嵌套、命令嵌套?
1.1 介绍一下字符串截取的知识
对于字符串变量A,要截取它的片段,语法是【A1=%A:~m,n%】。
例如对于字符串变量A=reurabgrien,执行命令【set A1=%A:~3,2%】后,A1就等于【ra】。
当m和n都是正数时,m指向起始字符(也可以理解成从默认的第0个字符偏移的值),n是截取的字符数量(默认是截取全部)。
1.2 什么是变量嵌套和命令嵌套?
上面讲的【%A:~m,n%】是字符串截取的基本形式,m和n是用常量去表示的,那么它们可不可以用变量去表示呢?也即实现「变量嵌套」呢?
答案是可以的,「变量嵌套」需要用到「命令嵌套」才能实现。
「变量嵌套」是最终实现的效果,而「命令嵌套」是实现这种效果的手段方法。
具体来说「命令嵌套」就是有层次地嵌套多个命令,而实现「变量嵌套」的「命令嵌套」方式就是嵌套call命令。
二、嵌套CALL命令的实现细则(只研究二层和三层)
(1)最里面的一层变量用一对百分号包裹。
(2)除非最里面,不然不管哪一层都必须用偶数对百分号。
比如下面这个示例,当有二层嵌套时,第二层用3对百分号,就出错了。
(3)第二层可以用两对或者四对进行包裹。
以二层嵌套为例,当第二层用6对百分号时,就会输出「echo关闭」;而进一步调至8层、10层也会出这种类型的错误。
(4)第三层的百分号对数必须是第二层的两倍。
如果第二层是两对,那么第三层必须是四对,不然就会出错。
如果第二层是四对,那么第三层必须是八对,不然就会报错
(5)嵌套两层就减一、嵌套三层就加一。
如果是嵌套两层,而第二层是两(三)对百分号,call的数量必须大于或等于1(2),也就是说call只能多不能少。
如果是嵌套三层,而第二层是两(三)对百分号,call的数量必须大于或等于2(3),也就是说call只能多不能少。
看下面的案例,即便是6个call,也是正确地执行。
(6)更多层的情况,我没有研究,不过可以肯定的是大部分的场景3层已经完全够了!
三、嵌套call命令的案例
在bat文件中执行下面的代码。
@echo off
set num=AmyAmy 2006 MP.CSDN.net
set a=123245
set b=87754321
echo.
echo a=%a% b=%b% num=%num%
set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo %result%
call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo %result%
call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo %result%
call call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo %result%
echo.
pause
结果如下。
我们可以看出,一共用call命令嵌套了三次,分别递增地用了1-3个call命令。
百分号的数量关系是正确的,set的右边语法完全没问题。
相应的,call越多,右边的变量被解析出来的层数也会越多。