批處理的延遲變數擴充套件

2021-06-20 12:42:41 字數 1436 閱讀 5634

set num=0

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

set /a num+=1

echo %%i,%num%

)

這個程式應該輸出:

1,12,2

3,34,4

5,56,6

7,78,8

9,910,10

實際輸出:

1,02,0

3,04,0

5,06,0

7,08,0

9,010,0

這是因為批處理程式的語句在執行前會進行預處理,對其中的變數進行替換。

for這一句在執行前處理完,相當於:

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

set /a num+=1

echo %%i,0

)

所以num位置都是輸出0.

改為下面**就可以了:

set num=0

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

set /a num+=1

echo %%i,!num!

)

這個雙!就是延遲擴充套件,等執行時才擴充套件變數。

命令列視窗裡是延遲擴充套件是預設開啟的。

也可以setlocal enabledelayedexpansion 開啟,setlocal disabledelayedexpansion 關閉。

關閉後,輸出:

1,!num!

2,!num!

3,!num!

4,!num!

5,!num!

6,!num!

7,!num!

8,!num!

9,!num!

10,!num!

看看下面批處理的命令視窗輸出就能看到!和%擴充套件的不同:

批處理內容:

echo %str%

echo !str!

命令列輸出:

d:\>echo hello word

hello word

d:\>echo !str!

hello word

可以看到第乙個執行時,變數已經替換掉了。

當然for裡的%%***形式的變數不存在擴充套件問題。

下面順便說一下批處理的特殊符號問題。

批處理的特殊符號如》,|等,如果要作為普通字元輸出,在前面加^即可。

如:echo ^>

echo ^^

%用這個方法在命令列可以,在批處理裡不行。

在批處理裡要:

echo %%

!在批處理裡要作為普通字元輸出要:

echo ^^!

批處理應該是堆積起來的,語法之類的比較亂,缺乏美感,只能說能用而已。

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

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

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

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

批處理中處理變數延遲

rem 比較兩種異同 體會變數延遲 echo off set a 4 set a 5 echo a pause setlocal enabledelayedexpansion set c 4 set c 5 echo c pause批處理執行機制 批處理讀取命令按行讀取,在處理之前要完成必要的預處理...