Window批處理 延遲環境變數

2021-09-30 07:57:12 字數 2162 閱讀 9221

延遲環境變數在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下執行依次執行下面的兩條命令:

code:  [copy to clipboard]

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。這時,如果我們想得到我們想要的結果,那麼就要開啟延遲環境變數了。

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

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

code:  [copy to clipboard]

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所有值全部例出來。

**:

批處理 延遲環境變數擴充套件

延遲變數全稱 延遲環境變數擴充套件 要理解這個東西 我們還得先理解一下什麼叫擴充套件 cmd 在解釋我們的命令的時候 首先會讀取命令列一條完整的命令 然後對其進行一些命令格式的匹配操作 看你所輸入的命令格式是不是符合他的要求.如果我們要在我們的命令中引用一些變數,那麼我們如何讓 cmd在解釋我們的命...

批處理 延遲環境變數擴充套件

延遲變數全稱 延遲環境變數擴充套件 要理解這個東西 我們還得先理解一下什麼叫擴充套件 cmd 在解釋我們的命令的時候 首先會讀取命令列一條完整的命令 然後對其進行一些命令格式的匹配操作 看你所輸入的命令格式是不是符合他的要求 如果我們要在我們的命令中引用一些變數,那麼我們如何讓 cmd在解釋我們的命...

window 環境變數

參考 或 一 概念 1 簡單來說,環境變數就是快速開啟資料夾的方法。就是 乙個變數 指向乙個 檔案路徑。2 環境變數中的path變數 path代表的是可執行檔案的搜尋路徑。我們只要知道 資料夾中程式名字,就可以通過執行輸入開啟你要開啟的程式。總結 環境變數配置分兩類 路徑變數 變數名可以自定義 可執...