1. 程式人生 > >windows批處理指令碼bat命令解析【9】SETLOCAL/ENDLOCAL

windows批處理指令碼bat命令解析【9】SETLOCAL/ENDLOCAL

原文地址:https://blog.csdn.net/qq_33336155/article/details/53516976

Setlocal 與 Endlocal 命令

開始與終止批處理檔案中環境改動的本地化操作。在執行 Setlocal 之後所做的環境改動只限於批處理檔案。要還原原先的設定,必須執行 Endlocal。達到批處理檔案結尾時,對於該批處理檔案的每個尚未執行的 Setlocal 命令,都會有一個隱含的 Endlocal 被執行。Endlocal結束批處理檔案中環境改動的本地化操作。在執行Endlocal 之後所做的環境改動不再僅限於批處理檔案。批處理檔案結束後,原先的設定無法還原。

語法:

Setlocal {enableextension | disableextensions} {enabledelayedexpansion | disabledelayedexpansion} 
...
Endlocal
...

如果命令副檔名被啟用,SETLOCAL 可以接受{}中的可選引數,啟動或停用命令處理器副檔名及延緩環境變數副檔名。詳細資訊,請參閱 CMD /? 和 SET /? 。
無論在 Setlocal 命令之前它們的設定是什麼,這些修改會一直保留到匹配的 Endlocal 命令。

示例:

@ECHO OFF
Echo Before Setlocal:
Set PATH
Pause
Setlocal
Rem reset environment var PATH
Set PATH=E:\TOOLS
Echo after Setlocal and reset PATH
Set PATH
Pause
Endlocal
Echo Recovery PATH by Endlocal
Set PATH

從上例我們可以看到環境變數PATH第1次被顯示得時候是系統預設路徑。被設定成了“E:\TOOLS”後顯示為“E:\TOOLS”。但當 Endlocal 後我們可以看到他又被還原成了系統的預設路徑。但這個設定只在該批處理執行的時候有作用。當批處理執行完成後環境變數PATH將會還原。

技巧: 

如果有一個引數,SETLOCAL 命令將設定 ERRORLEVEL 的值。如果有兩個有效引數中的一個,該值則為零。用下列技巧,您可以在批指令碼中使用這個來決定副檔名是否可用:

VERIFY OTHER 2>nul
SETLOCAL ENABLEEXTENSIONS
IF ERRORLEVEL 1 echo Unable to enable extensions

這個方法之所以有效,是因為在 CMD.EXE 的舊版本上,SETLOCAL不設定 ERRORLEVEL 值。具有不正確引數的 VERIFY 命令將ERRORLEVEL 值初始化成非零值。