3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
ENABLEDELAYEDEXPANSION是傳遞給SETLOCAL命令的參數(shù)(請參閱setlocal /?)
它的效果在腳本或以下期間有效ENDLOCAL:
當(dāng)?shù)竭_(dá)批處理腳本的末尾時(shí),將對該批處理腳本發(fā)出的ENDLOCAL所有未完成SETLOCAL命令執(zhí)行一個(gè)隱式執(zhí)行。
特別是,這意味著,如果SETLOCAL ENABLEDELAYEDEXPANSION在腳本中使用,除非采取特殊措施,否則所有環(huán)境變量更改都會(huì)在腳本末尾丟失。

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
我認(rèn)為您應(yīng)該了解延遲擴(kuò)展是什么。現(xiàn)有的答案不能(足夠)解釋恕我直言。
鍵入SET /?可以很好地說明問題:
延遲的環(huán)境變量擴(kuò)展對于避免當(dāng)前擴(kuò)展的局限性很有用,當(dāng)前擴(kuò)展的局限性發(fā)生在讀取一行文本而不是執(zhí)行文本時(shí)。下面的示例演示了立即變量擴(kuò)展的問題:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
永遠(yuǎn)不會(huì)顯示該消息,因?yàn)樵谧x取第一個(gè)IF語句時(shí),BOTH IF語句中的%VAR%被替換了,因?yàn)樗谶壿嬌习↖F的主體,它是一個(gè)復(fù)合語句。因此,復(fù)合語句中的IF實(shí)際上是將“ before”與“ after”進(jìn)行比較,這將永遠(yuǎn)是不相等的。同樣,以下示例將無法正常工作:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
因?yàn)樗粫?huì)在當(dāng)前目錄中建立文件列表,而只是將LIST變量設(shè)置為找到的最后一個(gè)文件。同樣,這是因?yàn)樽x取FOR語句時(shí),%LIST%僅被擴(kuò)展了一次,那時(shí)LIST變量為空。因此,我們正在執(zhí)行的實(shí)際FOR循環(huán)為:
for %i in (*) do set LIST= %i
只是將LIST設(shè)置為找到的最后一個(gè)文件。
延遲的環(huán)境變量擴(kuò)展使您可以在執(zhí)行時(shí)使用其他字符(感嘆號(hào))來擴(kuò)展環(huán)境變量。如果啟用了延遲變量擴(kuò)展,則可以按如下所示編寫以上示例以按預(yù)期方式工作:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
另一個(gè)示例是此批處理文件:
@echo off
setlocal enabledelayedexpansion
set b=z1
for %%a in (x1 y1) do (
set b=%%a
echo !b:1=2!
)
打印x2和y2:每1被2代替。
沒有setlocal enabledelayedexpansion,感嘆號(hào)就是這樣,它將產(chǎn)生!b:1=2!兩次回聲。
因?yàn)楫?dāng)是(塊)語句正常擴(kuò)展環(huán)境變量的讀取,擴(kuò)大%b:1=2%使用值b循環(huán)之前有:z2(但y2在未設(shè)置)。

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊
在某些使用延遲擴(kuò)展的程序中,需要ENABLEDELAYEDEXPANSION部分,也就是說,該程序通過在變量IF或FOR命令中通過將其名稱括在感嘆號(hào)中來獲取變量的值。
如果在不需要此擴(kuò)展名的腳本中啟用此擴(kuò)展名,則僅當(dāng)該腳本包含用驚嘆號(hào)!LIKE!括起來的名稱時(shí),該腳本的行為才會(huì)不同。!這些!。通常,名稱只是被擦除,但是如果偶然存在具有相同名稱的變量,則結(jié)果是不可預(yù)測的,并且取決于該變量的值及其出現(xiàn)的位置。
SETLOCAL部分僅在少數(shù)幾個(gè)專門的(遞歸)程序中是必需的,但是當(dāng)您希望確保不偶然修改任何具有相同名稱的現(xiàn)有變量,或者如果您想自動(dòng)刪除在您的程序中使用的所有變量時(shí),通常使用SETLOCAL部分程序。但是,由于沒有單獨(dú)的命令來啟用延遲的擴(kuò)展,因此需要此命令的程序還必須包含SETLOCAL部分。
- 3 回答
- 0 關(guān)注
- 1253 瀏覽
添加回答
舉報(bào)