setlocal 本地變數詳解

2022-02-03 09:02:36 字數 2294 閱讀 6109

命令 setlocal (開啟本地變數)  endlocal (結束本地變數)

很多新手不理解這句話是什麼意思,在批處理中有什麼作用。

其實在批處理中 setlocal 作用很大,配合 endlocal (結束本地變數)

它可以使你的**更簡潔,易讀,且不容易出錯。

舉例:假設你在批處理的開頭部分有這麼一句  set var=123

那麼在批處理結束以前,變數 var 的值就永遠是 123

除非你 執行了  set "var=" 來把它的值清空。或 set var=別的什麼 把它的值改變

否則它的值永遠是 123

當寫某些**時,需要把變數的值累加,如: set var=%var%567 此時var的值就是 123567

或是 set /a var+=1 (這是當var的值是有效數字時)每執行一次,var的值就會加1

但當某段**需要重複執行時,我們有時、甚至是經常需要var的值回到原始的值,即:123

你可能會說這還不好辦,一句就ok 了 set var=123或set var=

不錯,確實是這樣,但如果我們需要將一大堆的變數都會回到原始值呢?

比如: var num a b c d e f .........

你難道要

set var=

set num=

set a=

set b=

........

........

這樣嗎?

有了setlocal 和 endlocal 就不用這麼麻煩了。

看**@echo off

set var=123

set num=4456

set a=ham

setlocal

set var=abcd

set num=jkl

set a=efg

set max=1234567

::到了這一步,我想不用echo你應該也都知道,這三個變數的值改變了,

::並且還給乙個新的變數賦了值 max

::對於不熟悉setlocal 和 endlocal 命令的朋友來說,要想讓這

::三個變數回到開始的值,可能就只有回到開頭那三句去了,其實不用。

::一句就可以了,看下面的

endlocal

echo %var% %num% %a%

echo %max%

pause

看到區別了嗎?

不錯,setlocal 和 endlocal 這兩句中間的命令給所有的變數賦的值都消失了,

就好像從沒有執行過它們一樣。

執行 setlocal 以前變數的值是什麼 在執行 endlocal 以後,

又回到了什麼。如果之前是空值,即:沒有賦值

如:例子中的 max 那麼 echo %max% 就會顯示 echo 處於關閉狀態

以前 cn-dos 裡有位版主(好像就是我們論壇的第三方軟體版塊的現任版主)曾經很形象的解釋過這個問題,

這裡借用一下 ,記得不是很清楚了,加一點我自己的描述。

他說:批處理執行時會開闢一塊地方給變數,我們可以把它想像為一塊黑板,

你可以在黑板上任意寫字,在批處理中這種寫字,就是給變數賦值或清空或改變變數的值

如:set var=123  set num=   set /a str+=1 set var=%var% %num% 等等之類的。

而 setlocal 命令就是在黑板中又劃出一塊方塊來,你在這之後所寫的字就全在這個方塊中,

(當然這個方塊的容量、大小不會有什麼限制,你或者把他理解為在這個黑板上又覆蓋了一塊同樣大小的新的黑板,

更為恰當。當然這個黑板的容量大小應該要減去你在原來那塊黑板上所寫的內容,這個就不在這裡討論了,
知道個大概就行。)

當執行 endlocal (結束變數)後,相當於把你在原來那塊黑板上劃的方塊擦掉了,連內容一起擦掉了。

又或者說,把這個新的黑板拿走了,你在這個新黑板上寫的字也都沒有了,回到你面前的又是原來的那塊黑板,

當然你以前寫在上面的字仍然還在。它不會擦掉你的,也不會自動給你寫些新東西上去。

也就是 原來的變數還是原來的值,原來沒有賦值的,仍然是空值。不管你在那塊新黑板上寫過什麼,都過去了,

就象什麼也沒發生過一樣。
當新黑板上的內容與老黑板上的內容發生衝突時,則以新黑板上的內容為準,

若老黑板上的內容沒與新黑板的內容衝突時,老黑板上的內容在新黑板中仍然有效。

在提一句,新黑板最多只能連續覆蓋32塊,否則就會提示 「以達到最大遞迴層」的錯誤資訊。

所謂 「連續覆蓋」就是執行了 setlocal 而沒有執行 endlocal 的情況。

setlocal啟動批處理檔案中環境變數的本地化

setlocal啟動批處理檔案中環境變數的本地化 在執行 setlocal 之後所做的環境改動只限於批處理檔案。要還原原先的設定,必須執行 endlocal。學習了 學習了 開始批處理檔案中環境改動的本地化操作。在執行 setlocal 之後所做的環境改動只限於批處理檔案。要還原原先的設定,必須執行...

全域性變數 VS 本地變數

linux shell全域性變數與本地變數 變數釋放 全域性變數 程式內所有函式可以直接呼叫的變數,對所有函式都是可見的,程式執行完成後釋放變數所佔記憶體。區域性變數 相對於全域性變數,作用域僅在某個函式中,當函式執行完成釋放記憶體。全域性變數定義 在函式外定義變數,若沒有初始化則預設0值。本地 區...

JAVA 變數(類變數 成員變數 本地變數)

注 此文章引用位址 1 類變數 靜態屬性 2 成員變數 例項變數,屬性 3 本地變數 區域性變數 1.1 類變數 訪問修飾符 static type name value 1.2 什麼是類變數?被static修飾的屬性。1.3 作用範圍?在類變數定義之後。1.4 生命週期?在記憶體中存在的時間 出生...