亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SETLOCAL和ENABLEDELAYEDEXPANSION如何工作?

SETLOCAL和ENABLEDELAYEDEXPANSION如何工作?

月關寶盒 2019-10-30 10:02:29
我注意到在大多數腳本中,這兩個腳本通常在同一行中:SETLOCAL ENABLEDELAYEDEXPANSION實際上這兩個命令是分開的并且可以寫在單獨的行上嗎?將設置ENABLEDELAYEDEXPANSION,如果它被設置在腳本的第一線,直到劇本到底要不要禁止對腳本產生不利影響?
查看完整描述

3 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

ENABLEDELAYEDEXPANSION是傳遞給SETLOCAL命令的參數(請參閱setlocal /?)


它的效果在腳本或以下期間有效ENDLOCAL:


當到達批處理腳本的末尾時,將對該批處理腳本發出的ENDLOCAL所有未完成SETLOCAL命令執行一個隱式執行。


特別是,這意味著,如果SETLOCAL ENABLEDELAYEDEXPANSION在腳本中使用,除非采取特殊措施,否則所有環境變量更改都會在腳本末尾丟失。


查看完整回答
反對 回復 2019-10-30
?
胡子哥哥

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在未設置)。


查看完整回答
反對 回復 2019-10-30
?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

在某些使用延遲擴展的程序中,需要ENABLEDELAYEDEXPANSION部分,也就是說,該程序通過在變量IF或FOR命令中通過將其名稱括在感嘆號中來獲取變量的值。

如果在不需要此擴展名的腳本中啟用此擴展名,則僅當該腳本包含用驚嘆號!LIKE!括起來的名稱時,該腳本的行為才會不同。!這些!。通常,名稱只是被擦除,但是如果偶然存在具有相同名稱的變量,則結果是不可預測的,并且取決于該變量的值及其出現的位置。

SETLOCAL部分僅在少數幾個專門的(遞歸)程序中是必需的,但是當您希望確保不偶然修改任何具有相同名稱的現有變量,或者如果您想自動刪除在您的程序中使用的所有變量時,通常使用SETLOCAL部分程序。但是,由于沒有單獨的命令來啟用延遲的擴展,因此需要此命令的程序還必須包含SETLOCAL部分。


查看完整回答
反對 回復 2019-10-30
  • 3 回答
  • 0 關注
  • 1256 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號