-------------------------------------------------
作者:非常批處理論壇——英雄。
如轉(zhuǎn)載請(qǐng)注明出處。
--------------------------------------------------
這是大概是英雄丁亥年吐的最后一口血了,希望對(duì)這方面不明白的朋友好好看看。
大家都知道call命令是用來(lái)調(diào)用其他程序的。
想必有一定經(jīng)驗(yàn)的朋友都知道要輸出%a%需要這樣寫(xiě)“echo %%a%%”,這樣
百分號(hào)會(huì)脫掉一個(gè)。
先以一個(gè)簡(jiǎn)單的echo作為引子:
例一、
復(fù)制內(nèi)容到剪貼板
代碼:
@echo off
set a=b
echo %a%
echo %%a%%
echo %%%a%%%
echo %%%%a%%%%
echo %%%%%a%%%%%
pause
運(yùn)行結(jié)果是:
b
%a%
%b%
%%a%%
%%b%%
解說(shuō):不知道大家看沒(méi)看出來(lái)問(wèn)題。批處理中類似于這樣的變量替換究竟是
如何進(jìn)行的呢?我們姑且稱之為“替換步驟”
“替換步驟”大體分為兩步:
第一步:
當(dāng)百分號(hào)“%”是偶數(shù)時(shí)(只按一邊的百分號(hào)數(shù)目計(jì)算),變量將
不被替換,其它的也不變。當(dāng)百分號(hào)是奇數(shù)時(shí)(也只按一邊的百分號(hào)數(shù)目計(jì)
),最里層的“%a%”將被替換成變量的值,此時(shí)百分號(hào)數(shù)目將少了一個(gè)(
只按一邊計(jì))。
第二步:
第一步完成后,百分號(hào)就都是偶數(shù)了。好了,現(xiàn)在把百分號(hào)數(shù)目的
一半脫掉,剩下的就是結(jié)果了。
拿本例的“echo %%%%%a%%%%%”為例說(shuō)明一下。第一步,由于百分號(hào)有
5個(gè)是奇數(shù),因此最里層的%a%被其值代替,現(xiàn)在變?yōu)椤?%%%b%%%%”;第二
步,將百分號(hào)脫去一半,就變?yōu)椤?%b%%”。怎么樣,理解了嗎?
再看看有call的時(shí)候。
例二、
復(fù)制內(nèi)容到剪貼板
代碼:
@echo off
set a=b
set b=c
set c=d
call echo %%%%%%%%a%%%%%%%%
call echo %%%%%%%%%%%%%a%%%%%%%%%%%%%
pause
運(yùn)行結(jié)果是:
%%a%%
%%%b%%%
解說(shuō):由于有call的存在,“替換步驟”就會(huì)多進(jìn)行一次。以“call echo
%%%%%%%%%%%%%a%%%%%%%%%%%%%”為例。
“替換步驟”第一次:
第一步:
百分號(hào)有13個(gè)是奇數(shù),因此最里層的“%a%”被其值b替換,此時(shí)為
“%%%%%%%%%%%%b%%%%%%%%%%%%”,現(xiàn)在百分號(hào)數(shù)目為12個(gè)了。
第二步:
將百分號(hào)數(shù)脫去一半,現(xiàn)在為“%%%%%%b%%%%%%”。
“替換步驟”第二次:
第一步:
百分號(hào)有6個(gè)是偶數(shù),因此不替換。現(xiàn)在仍然是“%%%%%%b%%%%%%”。
第二步:
將百分號(hào)數(shù)脫去一半,現(xiàn)在為“%%%b%%%”。
結(jié)果就是“%%%b%%%”。
(如果有n個(gè)call那么就要進(jìn)行n+1次“替換步驟”。)
call命令在“變量延遲”中也遵循“替換步驟”。
舉個(gè)例子:我現(xiàn)在要將字符串str1的“superhero”部分替換為chess,在此我們用間接的方法實(shí)現(xiàn)。代碼如下:
復(fù)制內(nèi)容到剪貼板
代碼:
@echo off
set str1=mynameissuperhero
set str2=supxrhxro
set a=x
call call set str3=%%%%str1:%%str2:%a%=e%%=chess%%%%
echo %str3%
pause
因?yàn)橛昧藘蓚€(gè)call,因此要進(jìn)行3次“替換步驟”。
“替換步驟”第一次:
1、將“%a%”替換成“x”,結(jié)果為“%%%%str1:%%str2:x=e%%=chess%%%%”。
2、將百分號(hào)脫去一半,為“%%str1:%str2:x=e%=chess%%”。
“替換步驟”第二次:
1、將“%str2:x=e%”替換掉,結(jié)果為“%%str1:superhero=chess%%”。
2、將百分號(hào)脫去一半,為“%str1:superhero=chess%”。
“替換步驟”第三次:
1、將“%str1:superhero=chess%”替換掉,結(jié)果為“mynameischess”。
2、將百分號(hào)脫去一半(沒(méi)的脫了),因此結(jié)果為“mynameischess”。
怎么樣,明白了嗎?