1 微软关于cmd命令文档:一定要先在网上搜到微软关于cmd中那些命令的详细说明文档,尽管没啥用,先壮壮信心。
2 批处理运行命令的机制
让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如for命令等,其后用一对圆括号闭合的所有语句也当作一行),
在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值
3 变量识别与变量替换
在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程;
在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。
也就是说,一般情况下,在cmd执行命令之前,它会对%value%这样的变量进行替换。
4 变量的延迟扩展
如果说上面变量识别与变量替换类似c++中的编译预处理(替换宏之类的东东),(这个是事前的,静态的),那么这个延迟扩展就有点像是事后的,动态的扩展。
命令如下:
setlocal enabledelayedexpansion
设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展",
说明:
批处理文件中环境改动的本地化操作
A
在执行 SETLOCAL 之后,所做的环境改动只限于批处理文件。
要还原原先的设置,必须执行 ENDLOCAL。
B
达到批处理文件结尾时,对于该批处理文件的每个尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。
C
在延迟变量扩展中,要使用!来引用变量。
@echo off
setlocal enabledelayedexpansion
set k= 3
for /l %%i in (1,1,3) do (
set k=%%i
echo !k! %%i
)
pause nil
说明:
在延迟变量扩展中,像这样来引用这个变量 !k! ,否则可能会出现问题,没有为啥,记住就行。
pause:就是在命令执行完毕时,不让cmd窗口立即消失,而是暂停到那儿,方便我们看看执行结果。
@echo off
setlocalenabledelayedexpansion
set a=4
set a=5&echo !a!
pause
说明:
A 变量延迟的启动语句是“setlocalenabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果
B set a=5&echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时a的值就是5了)。
再看一段代码
@echo off
setlocal enabledelayedexpansion
set k= 3
for /l %%i in (1,1,3) do (
set k=%%i
echo %k% %%i
)
说明:
在延迟变量扩展中,像这样来引用这个变量 !k! ,否则可能会出现问题,要重视这句话。
@echo off
set k=yyy
for /l %%i in (1,1,3) do (
set k= %%i ::对k进行循环赋值
echo %k% %%i
)
pause nil
说明:
k有赋初值,则都替换yyy。
再来看代码
@echo off
for /l %%i in (1,1,3) do (
set k=%%i ::对k进行循环赋值
echo %k% %%i
)
pause nil
<img alt="" src="" />
说明:
注:k没有赋初值,则替换为空。