延遲環境變數擴充套件(bat)

2022-09-17 09:03:08 字數 2759 閱讀 8121

延遲環境變數擴充套件(bat)

之前遇到一些環境變數的問題,簡單記錄下

from

%var%相當於巨集變數直接將值換到命令中,然後執行。

!var!則是普通變數,每次可以直接讀取記憶體中的值。

延遲變數全稱\"延遲環境變數擴充套件\",要理解這個東西,我們還得先理解一下什麼叫擴充套件!

cmd在解釋我們的命令的時候,首先會讀取命令列一條完整的命令,然後對其進行一些命令格式的匹配操作,看你所輸入的命令格式是不是符合他的要求.

如果我們要在我們的命令中引用一些變數,那麼我們如何讓cmd在解釋我們的命令時,能識別出這個變數呢?這時我們就可以在變數名字兩邊加乙個%號, 如%name%.當cmd在對讀取我們的整行命令進行格式匹配的時候,就會發現name這個字元兩邊加了%號,就不會把他當作普通字元處理,而是會把他當 作乙個變數處理,變數名叫name!然後cmd就會找到變數名對應的值,用變數名的值替換掉這個變數名字(name),(如果變數名不存在值,就返回空 值).再將這個替換好並且匹配的命令執行!這個替換值的過程,就叫做變數擴充套件,說白了就是把變數的名字,用他的值給替換掉後執行!也就是批處理如何識別一 個變數的過程.

(注意:這裡只是變數的擴充套件的意思,不是延遲環境變數擴充套件,要理解延遲環境變數擴充套件,必須先理解什麼是變數的擴充套件) 也就是批處理如何識別乙個變數的過程.

例如這個bat

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在解釋命令時,首先會把一條完整的命令進行讀取,然後進行匹配操作,匹配時他會把命令裡的變數用變數的值個替換掉,然後執行這個替換好的命令.

問題就出在\"一條完整的命令\",在bat中,if for這樣的命令都可以加括號,將一些命令巢狀在裡面執行.這樣的話對於一條可以加擴號嵌其他命令的命令,他的完整格式就是for %%i in (....)這樣乙個整體.此時,如果我們如果在括號裡面嵌入一些設定變數值的命令,就會出現問題了!

看例子@echo off

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

set var=%%i

echo %var%

)執行後會顯示5個空行的錯誤提示!為什麼?根據我們上面說的知識來理解

通過這兩個例子,大家因該已經理解,如果只有環境變數擴充套件這個過程的話,如果我們在可以巢狀命令的命令中執行賦值操作時,會讓我們的bat出現給變數賦值的問題,即在命令執行之前變數便進行了替換,導致後沒操作中對變數的任何修改都不能在當前批處理中體現出來.

那麼這個時候\"延遲環境變數擴充套件\",這個概念就被提出來了,延遲環境變數擴充套件,即每條指令在執行之前才將變數進行替換,以保證對變數的任何修改都可以實時生效.

在批處理中,我們可以用setloacl enabledelayedexpansion這個命令來啟用\"延遲環境變數擴充套件\"

在我們啟用了\"延遲環境變數擴充套件\"後,當cmd在解釋涵有巢狀格式的命令時,他會把巢狀的命令一條一條的先執行一次,然後再進行匹配操作,這樣我們的 賦值操作就會完成.並且再\"延遲環境變數擴充套件\"啟用後,cmd會用!號來判斷這是不是乙個變數,如沒啟用來變數用%name%這樣的格式判斷,啟用後 就用!name!這樣的格式判斷了,這個符號我們需要注意!

例子:@echo off

setlocal enabledelayedexpansion

set var=1

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

set /a var+=%%i

echo !var!

)pause

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

再來乙個例子

@echo off

set var=test & echo %test%

pause

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

改成這樣

@echo off

setlocal enabledelayedexpansion

set var=test & echo !var!

pause.

@echo off

setlocal enabledelayedexpansion

if "%1"=="" (

echo "aaa"

) else (

set hour=%1

set /a smallhour=hour-1

echo !hour!

echo !smallhour!

if "%time:~0,5%" geq "%smallhour%:45" if

"%time:~0,5%" leq "%hour%:15" echo "aaa"

)

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

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

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

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

配置環境變數 bat

code by fireghost57 modify 2014.3.12 echo off 設定環境變數 set add path1 d oracle product 10.2.0 db 1 bin set env path1 oracle home 檢查path中是否已新增 wmic enviro...