在這裡,我們先來看看「變數擴充套件」有是怎麼一回事。
用cn-dos裡批處理達人willsort的原話,那就是:「在許多可見的官方文件中,均將使用一對百分號閉合環境變數以完成對其值的替換行為稱之為「擴充套件(expansion)」,這其實是乙個第一方的概念,是從命令直譯器的角度進行稱謂的,而從我們使用者的角度來看,則可以將它看作是引用(reference)、呼叫(call)或者獲取(get)。」(見:什麼情況下該使用變數延遲?說得直白一點,所謂的「變數擴充套件」,實際上就是很簡單的這麼一件事情:用具體的值去替換被引用的變數及緊貼在它左右的那對百分號。
既然只要延遲變數的擴充套件行為,就可以獲得我們想要的結果,那麼,具體的做法又是怎樣的呢?
一般說來,延遲變數的擴充套件行為,可以有如下選擇:
1、在適當位置使用 setlocal enabledelayedexpansion 語句;
2、在適當的位置使用 call 語句。
使用setlocal enabledelayedexpansion語句,那麼,示例1和示例2可以分別修改為:
示例3:
@echo off
setlocal enabledelayedexpansion
set num=0&&echo !num!
pause
示例4:
@echo off
set num=0
setlocal enabledelayedexpansion
for /f %%i in ('dir /a-d /b *.exe') do (
set /a num+=1
echo num 當前的值是 !num!
) echo 當前目錄下共有 %num% 個exe檔案
dir /a-d /b *.txt|findstr "test">nul&&(
echo 存在含有 test 字串的文字本件
)||echo 不存在含有 test 字串的文字檔案
if exist test.ini (
echo 存在 test.ini 檔案
) else 不存在 test.ini 檔案
pause
使用第call語句,那麼,示例1和示例2可以分別修改為:
示例5:
@echo off
set num=0&&call echo %%num%%
pause
示例6:
@echo off
set num=0
for /f %%i in ('dir /a-d /b *.exe') do (
set /a num+=1
call echo num 當前的值是 %%num%%
) echo 當前目錄下共有 %num% 個exe檔案
dir /a-d /b *.txt|findstr "test">nul&&(
echo 存在含有 test 字串的文字本件
)||echo 不存在含有 test 字串的文字檔案
if exist test.ini (
echo 存在 test.ini 檔案
) else 不存在 test.ini 檔案
pause
由此可見,如果使用 setlocal enabledelayedexpansion 語句來延遲變數,就要把原本使用百分號對閉合的變數引用改為使用感嘆號對來閉合;如果使用call語句,就要在原來命令的前部加上 call 命令,並把變數引用的單層百分號對改為雙層。 其中,因為call語句使用的是雙層百分號對,容易使人犯迷糊,所以用得較少,常用的是使用 setlocal enabledelayedexpansion 語句(set是設定的意思,local是本地的意思,enable是能夠的意思,delayed是延遲的意思,expansion是擴充套件的意思,合起來,就是:讓變數成為區域性變數,並延遲它的擴充套件行為)。
總結:
1、為什麼要使用變數延遲?因為要讓復合語句內部的變數實時感知到變數值的變化。
2、在哪些場合需要使用變數延遲語句
?在復合語句內部,如果某個變數的值發生了改變,並且改變後的值需要在復合語句內部的其他地方被用到,那麼,就需要使用變數延遲語句。而復合語句有:for語句、if……else語句、用連線符&、||和&&連線的語句、用管道符號|連線的語句,以及用括號括起來的、由多條語句組合而成的語句塊。最常見的場合,則是for語句和if……else語句。
3、怎樣使用變數延遲?
方法有兩種:
① 使用setlocal enabledelayedexpansion
語句:在獲取變化的變數值語句之前使用setlocal enabledelayedexpansion,並把原本使用百分號對閉合的變數引用改為使用感嘆號對來閉合;
② 使用 call 語句:在原來命令的前部加上 call 命令,並把變數引用的單層百分號對改為雙層。
4、如何關閉變數延遲?使用setlocal disabledelayedexpansion可以關閉變數延遲。
變數延遲(上)
文章修改自 變數延遲在 for語句中起著至關重要的作用,不只是在 for語句中,在其他的復合語句中,它也在幕後默默地工作著.例如,你編寫了這樣乙個 示例1 echo off set num 0 echo num pause 你的本意是想對變數 num賦值之後,再把這個值顯示出來,結果,顯示出來的並不...
變數延遲(上)
文章修改自 變數延遲在 for語句中起著至關重要的作用,不只是在 for語句中,在其他的復合語句中,它也在幕後默默地工作著.例如,你編寫了這樣乙個 示例1 echo off set num 0 echo num pause 你的本意是想對變數 num賦值之後,再把這個值顯示出來,結果,顯示出來的並不...
BAT 延遲變數
好東西,搞了很久才發現有這個東西。延遲環境變數在 bat裡是重中之重,雖然前面說過,熟練應用 for才算會寫批處理,但如果不懂延遲環境變數的話,那麼你就只能寫出簡單的批處理,而 for語句也不能發揮最大的作用。延遲環境變數在 cmd下預設是關閉的,如果要使用延遲環境變數,可以用以下兩種方法開啟 1....