在批處理腳本中使用ENABLEDELAYEDEXPANSION時,在其中創建的變量在調用ENDLOCAL後是否仍然存在?使用ENABLEDELAYEDEXPANSION
2
A
回答
5
據我所知,您的問題基本上是關於SETLOCAL
命令及其效果,無論使用的是ENABLEDELAYEDEXPANSION
選項(或任何其他選項)。
我的答案很簡單:沒有,假設變量之前沒有進入SETLOCAL
的範圍存在。
我的較長答案如下:
所有SETLOCAL
範圍內的一個變量所做的更改在離開範圍丟棄(即在達到ENDLOCAL
)。這包括:
限定先前未定義的變量:
@ECHO OFF <nul SET /P q=1. IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) SETLOCAL SET ttt= <nul SET /P q=2. IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) ENDLOCAL <nul SET /P q=3. IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
這個輸出:
1.undefined 2.defined 3.undefined
取消定義預先定義的變量:
@ECHO OFF SET ttt=1 <nul SET /P q=1. IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) SETLOCAL SET ttt= <nul SET /P q=2. IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) ENDLOCAL <nul SET /P q=3. IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined)
的輸出是:
1.defined 2.undefined 3.defined
改變變量的值:
@ECHO OFF SET ttt=1 ECHO 1.ttt=%ttt% SETLOCAL SET ttt=2 ECHO 2.ttt=%ttt% ENDLOCAL ECHO 3.ttt=%ttt%
而這將產生以下輸出:
1.ttt=1 2.ttt=2 3.ttt=1
正如我在開始時所述,上述適用於SETLOCAL
無論你是否使用它與其他選項或不。
總之,我想說的是,可以將計算結果保存在SETLOCAL
的範圍內,以便在ENDLOCAL
之後使用。這裏有一個小竅門,使得它可能:
…
ENDLOCAL & SET var=%var%
…
截至解析這一行的時候,SETLOCAL
命令仍然有效,所以%var%
得到評估,以你最最近存入var
值。當行執行時,var
變量在ENDLOCAL
後立即丟失其值,但SET命令已包含其值,剛剛被替換,所以var
收到它,以滿足所有人的需求。
按@Jeremy穆雷的評論,你也可以得到訪問ENDLOCAL
後改變的值,如果你提供ENDLOCAL
和命令(S)讀取變量用括號括起來的單個塊:
…
(
ENDLOCAL
SET var=%var%
anything else
)
…
效果將是相同的,因爲括號內的命令都解析並作爲一個單元執行:首先它們是全部解析,然後它們全部被執行。
相關問題
- 1. 使用enableDelayedExpansion
- 2. 如何在FOR/L中使用EnableDelayedExpansion?
- 3. 使用EnableDelayedExpansion時變量的問題
- 4. 批次:從SETLOCAL EnableDelayedExpansion
- 5. 如何逃脫「批量enabledelayedexpansion
- 6. SETLOCAL和ENABLEDELAYEDEXPANSION如何工作?
- 7. DOS使用EnableDelayedExpansion批量嵌套變量名稱
- 8. SETLOCAL enabledelayedexpansion在批處理文件
- 9. Windows批處理文件 - ENABLEDELAYEDEXPANSION查詢
- 10. 批SETLOCAL EnableDelayedExpansion和數學問題
- 11. 嵌套三(3)for循環&EnableDelayedExpansion
- 12. 即使使用EnableDelayedExpansion,也不會在for循環中擴展%時間百分比
- 13. 集不一樣,如果蝙蝠腳本+工作中,即使設置ENABLEDELAYEDEXPANSION
- 14. 批處理 - EnableDelayedExpansion,感嘆號和文件/文件夾名稱
- 15. 由setlocal enabledelayedexpansion引起的最大遞歸深度? (BATCH)
- 16. 無法在批處理文件中環甚至設置EnableDelayedExpansion
- 17. bat文件enabledelayedexpansion不會在IF語句中擴展
- 18. SETLOCAL ENABLEDELAYEDEXPANSION導致CD和PUSHD不會持續
- 19. 設置setlocal EnableDelayedExpansion時獲取變量的新值
- 20. 與enabledelayedexpansion問題文件重命名批處理腳本
- 21. 使用使用JavasScript
- 22. 使用highchart使用
- 23. 使用使用VBA
- 24. 使用使用XSLT
- 25. 使用使用jQuery
- 26. 使用使用SRC
- 27. 使用使用DLookup
- 28. 使用接口VS.使用「使用」
- 29. 使用使用M2Mqtt使用SSL
- 30. 使用mooFX使用jQuery
如果需要,您還可以在paren語句中放置endlocal以執行多個集合。 [想象這個例子中的換行符:)](ENDLOCAL 如果不是「%RETURN_SIG%」==「」SET「SIGNATURE =%RETURN_SIG%」 如果「%RETURN_SIG%」==「」SET「SIGNATURE =% DEFAULT_SIG%「 ) –
@Jeremy Murray:絕對如此。在執行第一個命令之前,所有括號命令都會被解析。所以它的效果就好像它們在同一條線上一樣。感謝您指出了這一點! –
我認爲只有在調用SETLOCAL時才能使用enabledelayedexpansion? – Mechaflash