批处理的延迟变量扩展


set num=0
for /L  %%i in (1,1,10) do (
	set /a num+=1
	echo %%i,%num%
)

这个程序应该输出:
1,1
2,2
3,3
4,4
5,5
6,6
7,7
8,8
9,9
10,10
实际输出:
1,0
2,0
3,0
4,0
5,0
6,0
7,0
8,0
9,0
10,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里的%%xxx形式的变量不存在扩展问题。


下面顺便说一下批处理的特殊符号问题。
批处理的特殊符号如>,|等,如果要作为普通字符输出,在前面加^即可。
如:
echo ^>
echo ^^

%用这个方法在命令行可以,在批处理里不行。
在批处理里要:
echo %%
!在批处理里要作为普通字符输出要:
echo ^^!


批处理应该是堆积起来的,语法之类的比较乱,缺乏美感,只能说能用而已。


你可能感兴趣的:(批处理)