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

首頁 > 編程 > BAT > 正文

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

2020-03-29 20:05:35
字體:
來源:轉載
供稿:網友

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

為了更好的說明問題,我們先引入一個例子。
例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 處于關閉狀態。”,而第二段代碼則會正確顯示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
国产精品自产拍在线观看中文| yw.139尤物在线精品视频| 亚洲va码欧洲m码| 色婷婷综合久久久久中文字幕1| 国产福利精品在线| 亚洲综合在线播放| 国产欧美在线播放| 欧美电影免费在线观看| 伊人久久综合97精品| 日韩性生活视频| 91免费国产视频| 欧美激情精品久久久久久变态| 97热精品视频官网| 亚洲视频电影图片偷拍一区| 福利精品视频在线| 2021久久精品国产99国产精品| 在线看日韩av| 欧美色视频日本版| 国产成人精品视频| 日韩精品极品在线观看播放免费视频| 欧美性生交xxxxxdddd| 日韩精品极品视频| 久久精品视频在线观看| 成人在线中文字幕| 国产精品黄色影片导航在线观看| 欧美日韩免费一区| 欧美性猛交xxx| 96精品视频在线| 欧美精品免费播放| 国产精品白丝av嫩草影院| 91久久精品在线| 日本19禁啪啪免费观看www| 欧美又大又硬又粗bbbbb| 欧美日韩免费网站| 亚洲色图25p| 7777kkkk成人观看| 疯狂欧美牲乱大交777| 96国产粉嫩美女| 国产成人精品一区二区三区| 日本精品视频在线| 69av成年福利视频| 亚洲精品二三区| 国产免费一区二区三区香蕉精| 在线视频欧美日韩| 国产成人精品免高潮费视频| 国产精品自拍网| 国产精品视频白浆免费视频| 亚洲成人a级网| 精品国内产的精品视频在线观看| 欧美大片在线影院| 欧美在线视频观看免费网站| 欧美成人午夜激情在线| 久久久免费观看视频| 中文字幕无线精品亚洲乱码一区| 久久久久久久久久久久av| 国产精品专区第二| 最近2019中文字幕在线高清| 在线观看欧美成人| 亚洲成人性视频| 欧美成人中文字幕| 国产ts人妖一区二区三区| 国产男女猛烈无遮挡91| 国产综合在线视频| 欧美大片在线看免费观看| 国产精品久久久久一区二区| 亚洲国产精品人久久电影| 亚洲欧美综合区自拍另类| 欧美极度另类性三渗透| 久久精品99无色码中文字幕| 日韩中文字幕视频在线观看| 欧美壮男野外gaytube| 成人h片在线播放免费网站| 7777精品久久久久久| 亚洲电影免费观看高清| 国产99久久精品一区二区永久免费| 亚洲国产成人一区| 国产精品永久免费在线| 久久久精品一区二区三区| 欧美性jizz18性欧美| 欧美电影免费在线观看| 欧美精品在线免费| 精品亚洲夜色av98在线观看| 国产精品欧美激情在线播放| 亚洲免费伊人电影在线观看av| 久久777国产线看观看精品| 国产精品久久久久久久久久| 亚洲国产天堂久久综合| 国产不卡精品视男人的天堂| 国产精品91久久| 日本免费在线精品| 亚洲图片制服诱惑| 中文字幕亚洲无线码在线一区| 亚洲视频在线观看网站| 国产999视频| 一区二区av在线| 在线看福利67194| 亚洲国产精品女人久久久| 成人免费看吃奶视频网站| 色中色综合影院手机版在线观看| 久久国产精品影视| 韩国三级电影久久久久久| 成人性生交大片免费观看嘿嘿视频| 欧美在线欧美在线| 福利一区视频在线观看| 欧美影院成年免费版| 久久的精品视频| 欧美电影在线观看| 久久露脸国产精品| 久久精品视频在线| 久久视频中文字幕| 久久综合88中文色鬼| 欧美成人午夜激情视频| 97精品一区二区视频在线观看| xvideos亚洲人网站| 亚洲欧美国产一区二区三区| 国产精品一久久香蕉国产线看观看| 57pao国产精品一区| 亚洲激情电影中文字幕| 欧美天堂在线观看| 国产精品白丝jk喷水视频一区| 91免费电影网站| 日韩电影中文字幕av| 九九久久久久99精品| 国产精品一二区| 国产成人亚洲综合青青| 国产成人精品一区二区在线| 欧美日韩一二三四五区| 久久在线免费视频| 亚洲成人a级网| 国产精品色午夜在线观看| 欧美国产在线视频| 日本一区二区三区在线播放| 国产精品午夜一区二区欲梦| 欧美精品在线看| 亚洲国产女人aaa毛片在线| 成人免费直播live| 91沈先生作品| 欧美日韩激情视频8区| 在线观看免费高清视频97| 成人高清视频观看www| 欧美日韩不卡合集视频| 精品综合久久久久久97| 欧美国产精品va在线观看| 国产精品视频网站| 色妞色视频一区二区三区四区| 91精品国产一区| 国产在线精品播放| 国产高清视频一区三区| 欧美最猛性xxxxx亚洲精品| 色99之美女主播在线视频| 亚洲在线观看视频| 欧美日韩国产精品| 日韩视频免费大全中文字幕| 8x拔播拔播x8国产精品| 欧美激情视频三区| 亚洲白虎美女被爆操| 中文字幕在线观看亚洲| 亚洲丁香久久久| 亚洲香蕉伊综合在人在线视看| 高清视频欧美一级| 国产成人欧美在线观看| 久久综合亚洲社区| 久久精品国产视频| 色婷婷亚洲mv天堂mv在影片|