變數延遲(下)

2021-06-02 09:14:38 字數 2657 閱讀 9762

在這裡,我們先來看看「變數擴充套件」有是怎麼一回事。 

用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....