3 回答

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

TA貢獻1825條經驗 獲得超6個贊
我認為您應該了解延遲擴展是什么。現有的答案不能(足夠)解釋恕我直言。
鍵入SET /?可以很好地說明問題:
延遲的環境變量擴展對于避免當前擴展的局限性很有用,當前擴展的局限性發生在讀取一行文本而不是執行文本時。下面的示例演示了立即變量擴展的問題:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
永遠不會顯示該消息,因為在讀取第一個IF語句時,BOTH IF語句中的%VAR%被替換了,因為它在邏輯上包括IF的主體,它是一個復合語句。因此,復合語句中的IF實際上是將“ before”與“ after”進行比較,這將永遠是不相等的。同樣,以下示例將無法正常工作:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
因為它不會在當前目錄中建立文件列表,而只是將LIST變量設置為找到的最后一個文件。同樣,這是因為讀取FOR語句時,%LIST%僅被擴展了一次,那時LIST變量為空。因此,我們正在執行的實際FOR循環為:
for %i in (*) do set LIST= %i
只是將LIST設置為找到的最后一個文件。
延遲的環境變量擴展使您可以在執行時使用其他字符(感嘆號)來擴展環境變量。如果啟用了延遲變量擴展,則可以按如下所示編寫以上示例以按預期方式工作:
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%
另一個示例是此批處理文件:
@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,感嘆號就是這樣,它將產生!b:1=2!兩次回聲。
因為當是(塊)語句正常擴展環境變量的讀取,擴大%b:1=2%使用值b循環之前有:z2(但y2在未設置)。

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