BAT 延遲變數

2022-06-11 20:42:10 字數 3019 閱讀 9284

**:

好東西,搞了很久才發現有這個東西。。。。。

延遲環境變數在

bat裡是重中之重,雖然前面說過,熟練應用

for才算會寫批處理,但如果不懂延遲環境變數的話,那麼你就只能寫出簡單的批處理,而

for語句也不能發揮最大的作用。

延遲環境變數在

cmd下預設是關閉的,如果要使用延遲環境變數,可以用以下兩種方法開啟:

1.

cmd下開啟/

關閉延遲環境變數

在cmd

下開啟或延遲環境變數用

/v引數:

cmd /v:on//

開啟延遲環境變數

cmd /v:off//

關閉延遲環境變數

2.

批處理中開啟/

關閉延遲環境變數

在批處理中開啟或關閉延遲環境變數用

setlocal

命令:setlocal enabledelayedexpansion//

開啟延遲環境變數

setlocal disabledelayedexpansion//

關閉延遲環境變數

延遲環境變數到底有什麼用呢?這裡我們就要從

cmd命令直譯器工作原理來說起了。

當我們準備執行一條命令的時候,命令直譯器會先將命令讀取,如果命令中有環境變數,那麼就會將變數的值先讀取來出,然後在執行這條命令,如:

echo %windir%

,當我們執行這條命令的時候,命令直譯器會先讀出

%windir%

的值,即

c:\windows

,然後執行

echo

,得到的結果是螢幕上顯示出

c:\windows

。這個應該很好理解。

但是,有的時候,我們在執行一條命令的時候,命令直譯器將環境變數的值讀出來以後,我們的環境變數的值發生了改變,這時個再執行命令就是使用的變數改變前的值,這就不是我們想要的結果了,舉個例子:

在cmd

下執行依次執行下面的兩條命令:

set a=1

set /a a+=1 > nul & echo %a%

執行後我們會發現,

echo 

得到的結果是

1,而不是我們想像中的

2,這時候我們可以直接輸入

set回車,就可以看到

a的值是

2,但為什麼顯示出來的是

1而不是

2呢?這就是因為在準備執行上面第二句

set /a a+=1 > nul & echo %a%

的時候,命令直譯器先將

a的值讀取出來了,這時還沒有執行

set /a a+=1

,所以a

的值是1

,然後將1給了

set,同時也給了

echo

,所以,雖然計算後,

a=2,但顯示出來的還是

a=1。這時,如果我們想得到我們想要的結果,那麼就要開啟延遲環境變數了。

延遲環境變數,顧名思義,延遲讀取了環境變數。當我們開啟延遲環境變數之後,命令直譯器就不再是執行命令前先將環境變數讀取出來再執行,而是當我們用到延遲環境變數的時候再去從環境變數中讀取出來,這就延遲了環境變數讀取的時間。

還是上面的例子,我們開啟延遲環境變數後再次執行:

cmd /v:on

set a=1

set /a a+=1 > nul &echo %a%

在第一句開啟延遲環境變數後,執行第三句的時候就不是先將

a的值讀出來,而是在使用到的時候再讀:執行到

set /a

的時候讀出

a=1,執行後

a=2,在執行

echo

的時候再去讀取a的值

a=2,所以最後的結果就是我們想要的2了。

我們注意到,在這裡呼叫環境變數

a不是用的

%a%而是用的

!a!。這是因為,我們用命令開啟了延遲環境變數,只是允許我們使用延遲環境變數,並不是所有變數的應用是延遲讀取,這時我們也可以用

%a%以正常的方式讀取環境變數,如果我們想使環境變數延遲讀取,我們就要用到

!a!來代替

%a%延遲環境變數在批處理中應用很廣泛,想要作出功能強大的批處理,有時延遲環境變數是不可缺少的。而應用最多的地方就是在

for和

if語句裡,因為

for和

if作為乙個語句,後面可以跟許多命令,不管跟多少命令,但他還是一條命令,所以說在

for和

if中應用的最多。舉個例子:

@echo off &setlocal enabledelayedexpansion

set a=0

for /l %%i in (1,1,10) do

(set /a a=%%i%%2

if !a!==0 echo 1-10的偶數有:%%i)

pause

上面的**是輸出1-

10中能被

2整除的數(在批處理中取餘運算子要用

%%代替命令提示符下的

%),雖然

if是單獨的一行,沒有和

set在一行,由於有「

()」括起來,他只是

for語句中的一部分。

如果我們將

!a!換成

%a%,那麼由於

a初始值是

0,那麼執行

for的時候就會將

a的值讀出來,雖然開啟了延遲環境變數,但在

if的時候就不會再次讀取

a的值了,由於

0==0

永遠成立,那麼結果就會將

1-10

所有值全部例出來。

如果對延遲環境變數還不太明白,多看看別人的**,自己多練習下慢慢就明白了。

延遲環境變數擴充套件(bat)

延遲環境變數擴充套件 bat 之前遇到一些環境變數的問題,簡單記錄下 from var 相當於巨集變數直接將值換到命令中,然後執行。var 則是普通變數,每次可以直接讀取記憶體中的值。延遲變數全稱 延遲環境變數擴充套件 要理解這個東西,我們還得先理解一下什麼叫擴充套件 cmd在解釋我們的命令的時候,...

bat檔案中批處理設定變數延遲的問題

在bat檔案中想實現對變數的賦值和輸出,發現設定的變數在後續使用中為空,如下 echo off for i in do set var i echo var 理論上,輸出結果應為當前命令所在目錄裡的所有檔名,可實際的輸出結果 卻為 bat檔案中批處理設定變數延遲的問題。這涉及到批處理命令中的變數延遲...

變數延遲(上)

文章修改自 變數延遲在 for語句中起著至關重要的作用,不只是在 for語句中,在其他的復合語句中,它也在幕後默默地工作著.例如,你編寫了這樣乙個 示例1 echo off set num 0 echo num pause 你的本意是想對變數 num賦值之後,再把這個值顯示出來,結果,顯示出來的並不...