**:
好東西,搞了很久才發現有這個東西。。。。。
延遲環境變數在
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=1set /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 enabledelayedexpansionset 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賦值之後,再把這個值顯示出來,結果,顯示出來的並不...