【转】call命令的“变量嵌套”和其“变量延迟”

http://www.sunenze.com/enzebbs/dispbbs.asp?boardid=4&Id=9159

 

先复习一下“字符串截取”的关键内容:

**********************************************
截 取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截 取长度(缺省为全部)。

百分号如果需要当成单一字符,必须写成%%

以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

比如设变量word为“abcdefghij”,变量num为“123456789”
%word:~4,1% 为e,其中4可以从变量num中取值,即%num:~3,1%,写成组合形式如下:
%word:~%num:~3,1%,1% 经测试这种写法不能正确执行,写成%word:~(%num:~3,1%),1%同样不行,那么,怎么实现这种变量嵌套呢?这就必须结合命令嵌套。

什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令, 用call语句调用字符串将其执行,从而得到最终结果。

例:用call语句实现命令嵌套
@echo off
set str1=aaa echo ok bbb
echo 初始字符串:%str1%
echo 生成命令字符串如下:
echo %str1:~4,7%
echo 运行命令字符串生成最终结果为:
call %str1:~4,7%  --->相当于执行了两次,第一次以str1("
aaa echo ok bbb")为原始字符串, 生成命令字符串 %str1:~4,7% (即

                                   “ echo ok ”),第二次以 str1( echo ok ”)为原始字符串,再 调用 call %str1:~4,7% 即输出了“ok”
pause

运行显示:
初始字符串:aaa echo ok bbb
生成命令字符串 如下:
echo ok
运行命令字符串 生成最终结果为:
ok
请按任意键继续. . .

 

 

 

http://bbs.verybat.org/archiver/?tid-8560.html

学习贴:对于call命令的“变量嵌套”和其“变量延迟”不明白的进!

-------------------------------------------------
作者:非常批处理论坛——英雄。
如转载请注明出处。
--------------------------------------------------

这是大概是英雄丁亥年吐的最后一口血了,希望对这方面不明白的朋友好好看看。

大家都知道call命令是用来调用其他程序的。
想必有一定经验的朋友都知道要输出%a%需要这样写“echo %%a%%”,这样
百分号会脱掉一个。

先以一个简单的echo作为引子:
例一、[code]@echo off
set a=b
echo %a%
echo %%a%%
echo %%%a%%%
echo %%%%a%%%%
echo %%%%%a%%%%%
pause[/code]运行结果是:
b
%a%
%b%
%%a%%
%%b%%

解说:不知道大家看没看出来问题。批处理中类似于这样的变量替换究竟是如何进行的呢?我们姑且称之为“替换步骤”,“替换步骤”大体分为两步:

    第一步:
        当百分号“%”是偶数时(只按一边的百分号数目计算),变量将不被替换,其它的也不变。当百分号是奇数时(也只按一边的百分号数目计
),最里层的“%a%”将被替换成变量的值,此时百分号数目将少了一个(只按一边计)。

    第二步:
第一步完成后,百分号就都是偶数了。好了,现在把百分号数目的一半脱掉,剩下的就是结果了。

    拿本例的“echo %%%%%a%%%%%”为例说明一下。

第一步,由于百分号有5个是奇数,因此最里层的%a%被其值代替,现在变为“%%%%b%%%%”;

第二步,将百分号脱去一半,就变为“%%b%%”。怎么样,理解了吗?

再看看有call的时候。
例二、[code]@echo off
set a=b
set b=c
set c=d
call echo %%%%%%%%a%%%%%%%%
call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%
pause[/code]运行结果是:
%%a%%
%%%b%%%
解说:由于有call的存在,“替换步骤”就会多进行一次。以“call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%”为例。

“替换步骤”第一次:
    第一步:
百分号有13个是奇数,因此最里层的“%a%”被其值b替换,此时为“%%%%%%%%%%%%b%%%%%%%%%%%%”,

现在百分号数目为12个了。

    第二步:
将百分号数脱去一半,现在为“%%%%%%b%%%%%%”。

“替换步骤”第二次:
    第一步:
百分号有6个是偶数,因此不替换。现在仍然是“%%%%%%b%%%%%%”。

    第二步:
将百分号数脱去一半,现在为“%%%b%%%”。

结果就是“%%%b%%%”
(如果有n个call那么就要进行n+1次“替换步骤”。)

call命令在“变量延迟”中也遵循“替换步骤”。
举个例子:我现在要将字符串str1的“superhero”部分替换为chess,在此我们用间接的方法实现。代码如下:[code]@echo off
set str1=mynameissuperhero
set str2=supxrhxro
set a=x
call call set str3=%%%%str1:%%str2:%a%=e%%=chess%%%%
echo %str3%
pause[/code]因为用了两个call,因此要进行3次“替换步骤”。
“替换步骤”第一次:
1、将“%a%”替换成“x”,结果为“%%%%str1:%%str2:x=e%%=chess%%%%”。
2、将百分号脱去一半,为“%%str1:%str2:x=e%=chess%%”。

“替换步骤”第二次:
1、将“%str2:x=e%”替换掉,结果为“%%str1:superhero=chess%%”。
2、将百分号脱去一半,为“%str1:superhero=chess%”。

“替换步骤”第三次:
1、将“%str1:superhero=chess%”替换掉,结果为“mynameischess”。
2、将百分号脱去一半(没的脱了),因此结果为“mynameischess”。

怎么样,明白了吗?


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值