DOS 批處理 setlocal命令、endlocal命令詳解
在 cmd
(Windows 命令提示符) 腳本中,@setlocal
是一個(gè)常用的組合命令,由兩部分組成:@
和 setlocal
。
- @:在腳本中,
@
用于阻止命令的顯示。通常,在執(zhí)行批處理文件時(shí),每一行命令都會(huì)被顯示出來(lái)。當(dāng)你在一行命令前加上@
,這行命令就不會(huì)在命令提示符窗口中顯示出來(lái)。這經(jīng)常用于使腳本的輸出更加干凈、整潔。 - setlocal:這是一個(gè)命令,它開(kāi)始局部化環(huán)境更改。通常在批處理文件中使用,以確保在腳本中所做的任何環(huán)境更改(例如設(shè)置或修改環(huán)境變量)不會(huì)影響到調(diào)用此批處理的上下文或其他批處理文件。當(dāng)腳本執(zhí)行完畢,使用
endlocal
命令可以結(jié)束這種局部環(huán)境,恢復(fù)所有的環(huán)境設(shè)置到setlocal
之前的狀態(tài)。
因此,@setlocal
的組合用途是在批處理文件的開(kāi)始部分使環(huán)境更改局部化,同時(shí)不顯示這條命令本身。這是編寫批處理腳本時(shí)的一種常見(jiàn)做法,以確保腳本不會(huì)無(wú)意中修改全局環(huán)境設(shè)置。
一、setlocal命令
命令格式
setlocal [ enableExtensions | disableExtensions ] [ enableDelayedExpansion | disableDelayedExpansion ]
命令功能
setlocal 命令用于開(kāi)始批處理文件中環(huán)境變量的本地化。本地化將持續(xù)到出現(xiàn)匹配的 endlocal 命令, 或者到達(dá)批處理文件結(jié)尾為止。
【enableExtensions參數(shù)】
啟用cmd.exe的命令擴(kuò)展開(kāi)特性。extension是“擴(kuò)大,延伸”的意思
【disableExtensions參數(shù)】
關(guān)閉cmd.exe的命令擴(kuò)展特性。
【enableDelayedExpansion參數(shù)】
開(kāi)啟cmd.exe的變量延遲展開(kāi)特性。expansion是“擴(kuò)展,展開(kāi)”的意思
【disableDelayedExpansionn參數(shù)】
關(guān)閉cmd.exe的變量延遲展開(kāi)特性。
【注意】
enableExtensions參數(shù)、disableExtensions參數(shù)相比 cmd.exe的 /E參數(shù),它們具有更高的優(yōu)先級(jí)。
enableDelayedExpansion參數(shù)、 disableDelayedExpansion參數(shù)相比 cmd.exe的 /V參數(shù),它們具有更高的優(yōu)先級(jí)。
二、endlocal命令
命令格式:
endlocal
命令功能:
endlocal 命令用于結(jié)束批處理文件中環(huán)境變量的本地化。
【“環(huán)境變量本地化”的作用】
在批處理文件中實(shí)現(xiàn)“環(huán)境變量本地化”,可以避免其對(duì)外部運(yùn)行環(huán)境的“污染”
示例
demo1.bat的內(nèi)容如下:
::demo1.bat @echo off set var=200
demo2.bat的內(nèi)容如下:
::demo2.bat @echo off setlocal set var=200 endlocal
運(yùn)行
C:\>set var=5
C:\>demo1
C:\out>echo %var%
200
C:\>set var=5
C:\>demo2
C:\>echo %var%
5
C:\>
總結(jié)
setlocal命令和endlocal命令在批處理文件中有效(在dos命令行環(huán)境中無(wú)效)
setlocal命令執(zhí)行以前的所有變量狀態(tài)(例如:變量值), 在endlocal命令(或者批處理文件)執(zhí)行完后會(huì)被恢復(fù)
在setlocal和endlocal(或者批處理文件的結(jié)尾處)之間,如果定義了新變量,在執(zhí)行 endlocal命令后,該變量會(huì)被刪除(即:其值為空)
在setlocal和endlocal(或者批處理文件的結(jié)尾處)之間,可以正常使用setlocal命令執(zhí)行以前的所有變量(包括外部dos命令行環(huán)境定義的變量)
無(wú)參的setlocal命令和帶參的setlocal命令(例如:setlocal enabledelayedexpansion)都遵守上述規(guī)則
無(wú)參的setlocal命令只對(duì)變量所做的修改進(jìn)行本地化,不會(huì)影響其作用域(setlocal和endlocal(或者批處理文件的結(jié)尾處)之間的局域空間)的命令擴(kuò)展特性和變量延遲展開(kāi)特性。
編寫批處理腳本時(shí),為了不“污染”外部運(yùn)行環(huán)境,同時(shí)對(duì)自己的運(yùn)行環(huán)境進(jìn)行“默認(rèn)設(shè)置”,應(yīng)該在批處理腳本中使用setlocal命令(和endlocal命令),下面是一個(gè)比較常用的“批處理腳本模板”
::demo.bat @echo off setlocal enableExtensions :: your code ... endlocal
寫作不易,如果您覺(jué)得對(duì)您有用
相關(guān)文章
用批處理文件自動(dòng)備份文件及文件夾,并自動(dòng)刪除n天前的文件
主要是利用Windows的腳本功能來(lái)計(jì)算要?jiǎng)h除文件的截止日期,然后for加dir命令來(lái)提取文件的日期進(jìn)行判斷2012-05-05用bat實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的批處理文件
用bat實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的批處理文件...2007-05-05批處理?xiàng)钶x三角效果實(shí)現(xiàn)代碼
這篇文章主要介紹了批處理打印彩色的楊輝三角效果實(shí)現(xiàn)代碼,喜歡的朋友可以測(cè)試下2014-03-03dos批量替換當(dāng)前目錄后綴名的實(shí)現(xiàn)代碼
有時(shí)候有些后綴名不滿足條件,就需要進(jìn)行批量的替換,如果人為的去替換,那么如果量少的話還好說(shuō),量多的話一個(gè)個(gè)去替換就太傻了,今天從網(wǎng)絡(luò)上面查找了一些批量替換的dos命令,用起來(lái)還挺好用的,就直接把代碼貼在這邊2013-07-07全盤刪除所有文件夾下的_desktop.ini的批處理bat文件
這篇文章主要介紹了用批處理刪除所有盤的desktop.ini的代碼,需要的朋友可以參考下2007-08-08