【轉】BAT 延遲變數

來源:互聯網
上載者:User

標籤:

延遲環境變數在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=1set /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:onset 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=0for /l %%i in (1,1,10) do (set /a a=%%i%%2if !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所有值全部例出來。

 

原文連結:http://hi.baidu.com/ynnal911/blog/item/2e91f91bd7c6e50a34fa41d6.html

【轉】BAT 延遲變數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.