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

2021-09-09 04:23:16 字數 3077 閱讀 2662

延遲變數全稱"

延遲環境變數擴充套件

",要理解這個東西

,我們還得先理解一下什麼叫擴充套件

!cmd

在解釋我們的命令的時候

,首先會讀取命令列一條完整的命令

,然後對其進行一些命令格式的匹配操作

,看你所輸入的命令格式是不是符合他的要求.

如果我們要在我們的命令中引用一些變數,

那麼我們如何讓

cmd在解釋我們的命令時

,能識別出這個變數呢

?這時我們就可以在變數名字兩邊加乙個%號

,如%name%.

當cmd

在對讀取我們的整行命令進行格式匹配的時候

,就會發現

name

這個字元兩邊加了%號

,就不會把他當作普通字元處理

,而是會把他當作乙個變數處理

,變數名叫

name.然後cmd

就會找到變數名對應的值

,用變數名的值替換掉這個變數名字

(name),(

如果變數名不存在值

,就返回空值

).再將這個替換好並且匹配的命令執行

!這個替換值的過程

,就叫做變數擴充套件

,說白了就是把變數的名字

,用他的值給替換掉後執行

!也就是批處理如何識別乙個變數的過程

.這就是變數擴充套件.

例如:

set

var=test

echo %var%

cmd在讀取到

echo %var%

這句命令後

,就會進行匹配操作

,它馬上就發現

var字元兩邊有%號

,這時他就會把他當作乙個變數處理

,檢視這個

var變數名是不是有值

,如果有就用他的值把變數名

var給替換掉

,這裡我們的

var在上一條命令

set var=test中,

給var

賦值為test,

所以他會用

test

把%var%

這個變數名替換掉

,替換後的結果就為

echo test了.

這些步驟都是

cmd進行匹配操作的步驟

,匹配完後

,他再執行

echo test

這條語句

,這時我們的

cmd中就會

echo

出乙個test了.

那什麼是延遲環境變數擴充套件呢?

在理解環境變數擴充套件時,

我們知道

cmd在解釋命令時

,首先會把一條完整的命令進行讀取

,然後進行匹配操作

,匹配時他會把命令裡的變數用變數的值替換掉

,然後執行這個替換好的命令.

cmd執行

bat的機制:

cmd是讀一句執行一句,何謂一句?

一般的一行,for, if

的整句,&、

&&、|| 等由連線符連線的整行,

()圓擴符之間的**

...都叫一句。

cmd讀一句後先不會執行,而會預處理該句子,所謂預處理就是為執行作一下準備工作,檢查**是否合法,替換

%%包含的變數,特殊符號的處理等。此時

,如果我們如果在括號裡面嵌入一些設定變數值的命令

,就會出現問題了!

例如:

@echo off

setlocal enabledelayedexpansion

::coder by dsw powerd by ibat

for /l %%i in (1,1,5) do

(

setvar=%%i

echo %var%)

pause

執行後會顯示5

個空行的錯誤提示

!為什麼

?根據我們上面說的知識來理解

通過這兩個例子,

大家因該已經理解

,如果只有環境變數擴充套件這個過程的話

,如果我們在可以巢狀命令的命令中執行賦值操作時

,會讓我們的

bat出現給變數賦值的問題

.那麼這個時候

"延遲環境變數擴充套件

",這個概念就被提出來了在批處理中

,我們可以用

setlocal enabledelayedexpansion

這個命令來啟用

"延遲環境變數擴充套件"

啟用了"

延遲環境變數擴充套件"後

,當cmd在解釋涵有巢狀格式的命令時

,他會把巢狀的命令一條一條的先執行一次

,然後再進行匹配操作

,這樣我們的賦值操作就會完成

.並且在

"延遲環境變數擴充套件

"啟用後

,cmd會用!

號來判斷這是不是乙個變數

,沒啟用則用%name%這樣的格式判斷

,啟用後就用

!name!

格式判斷了,這個符號我們需要注意!

上面的例子需要將%var%改為!var!

,修改如下:

例子:

@echo off

setlocal enabledelayedexpansion

::coder by dsw powerd by ibat

for /l %%i in (1,1,5) do

(

setvar=%%i

echo

!var!)

pause

這樣大家因該明白什麼是延遲環境變數擴充套件了吧.

再來乙個例子:

@echo off

setvar=test & echo %var%    //這條命令放在一行,表示他是一條完整的命令,不啟用"延遲環境變數擴充套件",就會出現上面的賦值錯誤!

pause 

正確的方式如下:

@echo off

setlocal enabledelayedexpansion

setvar=test & echo !

var!

pause

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

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

Window批處理 延遲環境變數

延遲環境變數在bat裡是重中之重,雖然前面說過,熟練應用for才算會寫批處理,但如果不懂延遲環境變數的話,那麼你就只能寫出簡單的批處理,而for語句也不能發揮最大的作用。延遲環境變數在cmd下預設是關閉的,如果要使用延遲環境變數,可以用以下兩種方法開啟 1.cmd下開啟 關閉延遲環境變數 在cmd下...

批處理之環境變數擴充套件

1.環境變數替換已如下增強 摘自set命令幫助 path str1 str2 會擴充套件 path 環境變數,用 str2 代替擴充套件結果中的每個 str1 要有效地從擴充套件結果中刪除所有的 str1 str2 可以是空的。str1 可以以星號打頭 在這種情況下,str1 會從擴充套件結果的 開...