亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > BAT > 正文

批處理中setlocal enabledelayedexpansion的作用詳細整理

2020-07-26 20:20:55
字體:
來源:轉載
供稿:網友

設置本地為延遲擴展。其實也就是:延遲變量,全稱延遲環境變量擴展, 想進階,變量延遲是必過的一關!所以這一部分希望你能認真看。

為了更好的說明問題,我們先引入一個例子。
例1:

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

結果:4
解說:為什么是4而不是5呢?在echo之前明明已經把變量a的值改成5了?讓我們先了解一下批處理運行命令的機制:批處理讀取命令時是按行讀取的(另外例如for命令等,其后用一對圓括號閉合的所有語句也當作一行),在處理之前要完成必要的預處理工作,這其中就包括對該行命令中的變量賦值。我們現在分析一下例1,批處理在運行到這句“set a=5&echo %a%”之前,先把這一句整句讀取并做了預處理――對變量a賦了值,那么%a%當然就是4了?。]有為什么,批處理就是這樣做的。)而為了能夠感知環境變量的動態變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之后,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說“延遲”了對變量的賦值。那么如何開啟變量延遲呢?變量延遲又需要注意什么呢?

舉個例子說明一下:

例2:

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

結果:5
解說:由于啟動了變量延遲,得到了正確答案。變量延遲的啟動語句是“setlocal enabledelayedexpansion”,并且變量要用一對嘆號“!!”括起來(注意要用英文的嘆號),否則就沒有變量延遲的效果。分析一下例2,首先“setlocal enabledelayedexpansion”開啟變量延遲,然后“set a=4”先給變量a賦值為4,“set a=5&echo !a!”這句是給變量a賦值為5并輸出(由于啟動了變量延遲,所以批處理能夠感知到動態變化,即不是先給該行變量賦值,而是在運行過程中給變量賦值,因此此時a的值就是5了)。再舉一個例子鞏固一下。
例3:

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

結果:12345

解說:本例開啟了變量延遲并用“!!”將變量擴起來,因此得到我們預期的結果。如果不用變量延遲會出現什么結果呢?結果是這樣的:ECHO 處于關閉狀態。ECHO 處于關閉狀態。ECHO 處于關閉狀態。ECHO 處于關閉狀態。ECHO 處于關閉狀態。即沒有感知到for語句中的動態變化。

batman的說明
我來簡要說一下吧:
set:設置
local:本地(環境變量)
enable:能夠
delayed:延遲
expansion:擴展
setlocal enabledelayedexpansion就是擴展本地環境變量延遲,
比較下面兩段代碼:

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

第一段代碼只會顯示10行“ECHO 處于關閉狀態?!保诙未a則會正確顯示1-10的10行數字。這是為什么呢?因為在兩段代碼的for循環前str都是沒有被定義的,而由于第一段代碼沒有開啟變量延遲,所以str值一直是沒有定義,因而顯示出了10行報
錯信息;而第二段代碼開啟了變量延遲,在for循環中每次賦予str的值被傳遞下去,因而會正確顯示10行數字,但這里的str變量符必須要寫成!str!,這是沒有道理可講的,只要記住就好了。

setlocal enabledelayedexpansion 是什么意思?

是:設置本地為延遲擴展。其實也就是:延遲變量,全稱"延遲環境變量擴展",
在cmd執行命令前會對腳本進行預處理,其中有一個過程是變量識別過程,在這個過程中,如果有兩個%括起來的如%value%類似這樣的變量,就會對其進行識別,并且查找這個變量對應的值,再而將值替換掉這個變量,這個替換值的過程,就叫做變量擴展,然后再執行命令。

在解釋之前,先看幾個例子的區別:
例一:

set value=kkkkkkk echo %value% 

將這段代碼保存到一個后綴為bat的文本文件中。然后打開dos,進到對應目錄下,執行這個文件,結果如下:
C:/Documents and Settings/Administrator/桌面/ln/temp/bat>set value=kkkkkkk
C:/Documents and Settings/Administrator/桌面/ln/temp/bat>echo kkkkkkk
kkkkkkk
最后一行是結果,但是在結果之前,還有兩句,set value=kkkkkkk 和 echo kkkkkkk,但是在語句中,我們并沒有寫echo kkkkkkk的語句,這表明至少在執行到echo %value% 這句時,對變量進行的值的替換。這就是變量的擴展。
那么什么是變量的延遲擴展呢?
如果大家知道C++的“靜態變量”概念,那就應該知道,c++編譯的時候,會對靜態變量進行值的替換,但這個替換是基于靜態的前提下,那么進行變量擴展時,也是這樣,但如果出現動態的情況會怎樣?在cmd執行中,發生動態的一種情況是在 for語句中進行變量賦值,例如:
例二:

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


執行這樣的腳本,出現如下結果:
_1
_2
_3
結果出現這三句話。_ 表示空格
注:k沒有賦初值,則替換為空。

例三:

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


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

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

結果:
3 1
3 2
3 3
這里已經是用了延遲變量,為什么還會出現這種情況呢?再看實例五:
實例五:

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

結果:
1 1
2 2
3 3
原來在延遲變量擴展中,要使用!來引用變量。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品视频| 日韩精品久久久久久福利| 亚洲第一色中文字幕| 国产日韩中文字幕| 精品国产鲁一鲁一区二区张丽| 久久久91精品国产| 久久伊人精品天天| 成人日韩在线电影| 久久精品人人做人人爽| 久久久噜噜噜久久久| 欧美激情一区二区三级高清视频| 91高潮精品免费porn| 国产va免费精品高清在线| 久久久久久国产精品美女| 国产亚洲精品激情久久| 91在线看www| 国产成一区二区| 91在线直播亚洲| 国产精品电影久久久久电影网| 久热爱精品视频线路一| 欧美老女人bb| 精品视频在线播放色网色视频| 欧美日韩成人在线视频| 国产精自产拍久久久久久| 亚洲男人av电影| 最新日韩中文字幕| 国产一区二区三区丝袜| 欧美性xxxx极品高清hd直播| 日韩精品极品视频免费观看| 久久成人精品电影| 亚洲白拍色综合图区| 成人中文字幕在线观看| 久久久综合免费视频| 亚洲无限乱码一二三四麻| 欧美成人亚洲成人日韩成人| 欧美视频在线免费| 91精品在线观看视频| 欧美成aaa人片在线观看蜜臀| 亚洲va欧美va国产综合久久| 欧美人与性动交a欧美精品| 91免费的视频在线播放| 欧美电影在线观看网站| 国产精品久久精品| 亚洲国产成人精品女人久久久| 欧美大秀在线观看| 国产福利视频一区| 在线免费观看羞羞视频一区二区| 在线观看日韩欧美| 成人av.网址在线网站| 国产精品综合不卡av| 毛片精品免费在线观看| 久久99亚洲精品| 日韩激情视频在线播放| 亚洲人成电影在线播放| 亚洲综合视频1区| 成人性教育视频在线观看| 亚洲精品在线91| 亚洲a级在线播放观看| 正在播放亚洲1区| 亚洲精品福利在线| 欧美精品激情在线观看| 久久中文字幕在线| 中文字幕自拍vr一区二区三区| 亚洲高清福利视频| xxx欧美精品| 免费99精品国产自在在线| 欧美在线视频网站| 成人激情在线播放| 国产亚洲精品美女久久久| 中国日韩欧美久久久久久久久| 国产精品偷伦免费视频观看的| 成人444kkkk在线观看| 久久精品中文字幕免费mv| 4444欧美成人kkkk| 一夜七次郎国产精品亚洲| 国产精品色婷婷视频| 亚洲伊人一本大道中文字幕| 亚洲国产美女久久久久| 51久久精品夜色国产麻豆| 国产成+人+综合+亚洲欧美丁香花| 黄色成人av在线| 亚洲一品av免费观看| 亚洲欧美另类国产| 欧美大荫蒂xxx| 一本大道久久加勒比香蕉| 国产欧美婷婷中文| 亚洲日本aⅴ片在线观看香蕉| 亚洲精品一区中文字幕乱码| 久久国产精品久久久久久| 97久久超碰福利国产精品…| 国产精品视频内| 亚洲国产精品va在线看黑人| 亚洲福利在线看| 欧美激情区在线播放| 久久夜色精品国产亚洲aⅴ| 亚洲最新av在线网站| 国产97色在线|日韩| 丝袜美腿精品国产二区| 98精品国产高清在线xxxx天堂| 亚洲新声在线观看| 国产亚洲欧洲黄色| 亚洲大胆人体视频| 国产成人啪精品视频免费网| 丝袜亚洲另类欧美重口| 欲色天天网综合久久| 一本一本久久a久久精品牛牛影视| 国外日韩电影在线观看| 国产精品一区二区三| 日韩欧中文字幕| 久久久精品视频成人| 成人黄色影片在线| 欧美裸体xxxx极品少妇软件| 亚洲三级 欧美三级| 国产精品第100页| 成人在线中文字幕| 日韩av高清不卡| 国产精品观看在线亚洲人成网| 国产v综合v亚洲欧美久久| 国产亚洲精品久久久优势| 欧美精品videosex极品1| 欧美激情免费视频| 欧美精品videossex性护士| 国产精品第一页在线| 精品久久久久久久久久久久久久| 一二美女精品欧洲| 亚洲欧美日韩国产中文专区| 不卡av在线网站| 95av在线视频| 久久综合久久美利坚合众国| 在线看片第一页欧美| 91精品美女在线| 欧美肥老妇视频| 91精品国产综合久久香蕉| 国产91在线视频| 成人av电影天堂| 日韩在线中文字| 在线观看中文字幕亚洲| 日韩在线视频免费观看高清中文| 精品免费在线视频| 欧美日韩中国免费专区在线看| 成人福利在线视频| 精品成人国产在线观看男人呻吟| 成人欧美在线视频| 久久影院资源站| 欧美做爰性生交视频| 亚洲视频网站在线观看| 欧美最近摘花xxxx摘花| 日韩成人激情影院| 在线播放亚洲激情| 亚洲成人免费在线视频| 久久人91精品久久久久久不卡| 日韩免费观看网站| 久久视频在线直播| 欧美亚洲视频在线观看| 欧美专区日韩视频| 国产乱肥老妇国产一区二| 欧美激情欧美激情在线五月| 午夜精品久久久久久久99黑人| 中文字幕欧美日韩va免费视频| 欧美黑人一级爽快片淫片高清| 欧美肥臀大乳一区二区免费视频| 亚洲国产古装精品网站| 欧美与欧洲交xxxx免费观看| 国产成人亚洲综合青青|