佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > 批處理中setlocal enabledelayedexpansion的作用詳細(xì)整理

批處理中setlocal enabledelayedexpansion的作用詳細(xì)整理

熱門標(biāo)簽:服務(wù)器配置 呼叫中心市場(chǎng)需求 網(wǎng)站文章發(fā)布 美圖手機(jī) 智能手機(jī) 銀行業(yè)務(wù) 鐵路電話系統(tǒng) 檢查注冊(cè)表項(xiàng)

設(shè)置本地為延遲擴(kuò)展。其實(shí)也就是:延遲變量,全稱延遲環(huán)境變量擴(kuò)展, 想進(jìn)階,變量延遲是必過(guò)的一關(guān)!所以這一部分希望你能認(rèn)真看。

為了更好的說(shuō)明問(wèn)題,我們先引入一個(gè)例子。
例1:

@echo off 
set a=4 
set a=5echo %a% 
pause 

結(jié)果:4
解說(shuō):為什么是4而不是5呢?在echo之前明明已經(jīng)把變量a的值改成5了?讓我們先了解一下批處理運(yùn)行命令的機(jī)制:批處理讀取命令時(shí)是按行讀取的(另外例如for命令等,其后用一對(duì)圓括號(hào)閉合的所有語(yǔ)句也當(dāng)作一行),在處理之前要完成必要的預(yù)處理工作,這其中就包括對(duì)該行命令中的變量賦值。我們現(xiàn)在分析一下例1,批處理在運(yùn)行到這句“set a=5echo %a%”之前,先把這一句整句讀取并做了預(yù)處理——對(duì)變量a賦了值,那么%a%當(dāng)然就是4了?。](méi)有為什么,批處理就是這樣做的。)而為了能夠感知環(huán)境變量的動(dòng)態(tài)變化,批處理設(shè)計(jì)了變量延遲。簡(jiǎn)單來(lái)說(shuō),在讀取了一條完整的語(yǔ)句之后,不立即對(duì)該行的變量賦值,而會(huì)在某個(gè)單條語(yǔ)句執(zhí)行之前再進(jìn)行賦值,也就是說(shuō)“延遲”了對(duì)變量的賦值。那么如何開(kāi)啟變量延遲呢?變量延遲又需要注意什么呢?

舉個(gè)例子說(shuō)明一下:

例2:

@echo off 
setlocal enabledelayedexpansion 
set a=4 
set a=5echo !a! 
pause

結(jié)果:5
解說(shuō):由于啟動(dòng)了變量延遲,得到了正確答案。變量延遲的啟動(dòng)語(yǔ)句是“setlocal enabledelayedexpansion”,并且變量要用一對(duì)嘆號(hào)“!!”括起來(lái)(注意要用英文的嘆號(hào)),否則就沒(méi)有變量延遲的效果。分析一下例2,首先“setlocal enabledelayedexpansion”開(kāi)啟變量延遲,然后“set a=4”先給變量a賦值為4,“set a=5echo !a!”這句是給變量a賦值為5并輸出(由于啟動(dòng)了變量延遲,所以批處理能夠感知到動(dòng)態(tài)變化,即不是先給該行變量賦值,而是在運(yùn)行過(guò)程中給變量賦值,因此此時(shí)a的值就是5了)。再舉一個(gè)例子鞏固一下。
例3:

@echo off 
setlocal enabledelayedexpansion 
for /l %%i in (1,1,5) do ( set a=%%i echo !a! ) 
pause

結(jié)果:12345

解說(shuō):本例開(kāi)啟了變量延遲并用“!!”將變量擴(kuò)起來(lái),因此得到我們預(yù)期的結(jié)果。如果不用變量延遲會(huì)出現(xiàn)什么結(jié)果呢?結(jié)果是這樣的:ECHO 處于關(guān)閉狀態(tài)。ECHO 處于關(guān)閉狀態(tài)。ECHO 處于關(guān)閉狀態(tài)。ECHO 處于關(guān)閉狀態(tài)。ECHO 處于關(guān)閉狀態(tài)。即沒(méi)有感知到for語(yǔ)句中的動(dòng)態(tài)變化。

batman的說(shuō)明

我來(lái)簡(jiǎn)要說(shuō)一下吧:
set:設(shè)置
local:本地(環(huán)境變量)
enable:能夠
delayed:延遲
expansion:擴(kuò)展
setlocal enabledelayedexpansion就是擴(kuò)展本地環(huán)境變量延遲,
比較下面兩段代碼:

@echo off 
for /l %%i in (1,1,10) do ( 
set "str=%%i" 
echo %str% 
) 
pause>nul 
@echo offsetlocal enabledelayedexpansion 
for /l %%i in (1,1,10) do ( 
set "str=%%i" 
echo !str! 
) 
pause>nul 

第一段代碼只會(huì)顯示10行“ECHO 處于關(guān)閉狀態(tài)?!保诙未a則會(huì)正確顯示1-10的10行數(shù)字。這是為什么呢?因?yàn)樵趦啥未a的for循環(huán)前str都是沒(méi)有被定義的,而由于第一段代碼沒(méi)有開(kāi)啟變量延遲,所以str值一直是沒(méi)有定義,因而顯示出了10行報(bào)
錯(cuò)信息;而第二段代碼開(kāi)啟了變量延遲,在for循環(huán)中每次賦予str的值被傳遞下去,因而會(huì)正確顯示10行數(shù)字,但這里的str變量符必須要寫(xiě)成!str!,這是沒(méi)有道理可講的,只要記住就好了。

setlocal enabledelayedexpansion 是什么意思?

是:設(shè)置本地為延遲擴(kuò)展。其實(shí)也就是:延遲變量,全稱"延遲環(huán)境變量擴(kuò)展",
在cmd執(zhí)行命令前會(huì)對(duì)腳本進(jìn)行預(yù)處理,其中有一個(gè)過(guò)程是變量識(shí)別過(guò)程,在這個(gè)過(guò)程中,如果有兩個(gè)%括起來(lái)的如%value%類似這樣的變量,就會(huì)對(duì)其進(jìn)行識(shí)別,并且查找這個(gè)變量對(duì)應(yīng)的值,再而將值替換掉這個(gè)變量,這個(gè)替換值的過(guò)程,就叫做變量擴(kuò)展,然后再執(zhí)行命令。

在解釋之前,先看幾個(gè)例子的區(qū)別:
例一:

set value=kkkkkkk 
echo %value% 

將這段代碼保存到一個(gè)后綴為bat的文本文件中。然后打開(kāi)dos,進(jìn)到對(duì)應(yīng)目錄下,執(zhí)行這個(gè)文件,結(jié)果如下:
C:\Documents and Settings\Administrator\桌面\ln\temp\bat>set value=kkkkkkk
C:\Documents and Settings\Administrator\桌面\ln\temp\bat>echo kkkkkkk
kkkkkkk
最后一行是結(jié)果,但是在結(jié)果之前,還有兩句,set value=kkkkkkk 和 echo kkkkkkk,但是在語(yǔ)句中,我們并沒(méi)有寫(xiě)echo kkkkkkk的語(yǔ)句,這表明至少在執(zhí)行到echo %value% 這句時(shí),對(duì)變量進(jìn)行的值的替換。這就是變量的擴(kuò)展。

那么什么是變量的延遲擴(kuò)展呢?

如果大家知道C++的“靜態(tài)變量”概念,那就應(yīng)該知道,c++編譯的時(shí)候,會(huì)對(duì)靜態(tài)變量進(jìn)行值的替換,但這個(gè)替換是基于靜態(tài)的前提下,那么進(jìn)行變量擴(kuò)展時(shí),也是這樣,但如果出現(xiàn)動(dòng)態(tài)的情況會(huì)怎樣?在cmd執(zhí)行中,發(fā)生動(dòng)態(tài)的一種情況是在 for語(yǔ)句中進(jìn)行變量賦值,例如:
例二:

@echo off 
for /l %%i in (1,1,3) do ( 
set k=%%i ::對(duì)k進(jìn)行循環(huán)賦值 
echo %k% %%i 
) 


執(zhí)行這樣的腳本,出現(xiàn)如下結(jié)果:
_1
_2
_3
結(jié)果出現(xiàn)這三句話。_ 表示空格
注:k沒(méi)有賦初值,則替換為空。

例三:

@echo off 
set k=yyy 
for /l %%i in (1,1,3) do ( 
set k= %%i ::對(duì)k進(jìn)行循環(huán)賦值 
echo %k% %%i 
)


結(jié)果:
yyy 1
yyy 2
yyy 3
注:k有賦初值,則都替換為yyy。、
實(shí)例四:

@echo off 
setlocal enabledelayedexpansion 
set k= 3 
for /l %%i in (1,1,3) do ( 
set k=%%i 
echo %k% %%i 
)

結(jié)果:
3 1
3 2
3 3
這里已經(jīng)是用了延遲變量,為什么還會(huì)出現(xiàn)這種情況呢?再看實(shí)例五:
實(shí)例五:

@echo off 
setlocal enabledelayedexpansion 
set k= 3 
for /l %%i in (1,1,3) do ( 
set k=%%i 
echo !k! %%i 
)

結(jié)果:
1 1
2 2
3 3
原來(lái)在延遲變量擴(kuò)展中,要使用!來(lái)引用變量。

您可能感興趣的文章:
  • cmd SETLOCAL使用介紹
  • dos 環(huán)境變量延遲擴(kuò)展enabledelayedexpansion詳解

標(biāo)簽:新疆 樂(lè)山 上海 紅河 河南 長(zhǎng)治 滄州 沈陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《批處理中setlocal enabledelayedexpansion的作用詳細(xì)整理》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    安乡县| 高阳县| 承德县| 宜阳县| 铜鼓县| 庆城县| 万山特区| 稷山县| 尼木县| 栖霞市| 清新县| 绥中县| 陕西省| 宽甸| 龙川县| 迁西县| 田阳县| 嘉禾县| 巩义市| 邻水| 班玛县| 白河县| 陆良县| 深圳市| 宜君县| 南川市| 汉中市| 平塘县| 塘沽区| 南投市| 嵊泗县| 天峻县| 寻乌县| 长汀县| 秭归县| 婺源县| 涡阳县| 蒙自县| 余干县| 白河县| 万源市|