命令解释器是扩展环境变量的行为大体以下:首先读取命令行的一条完整语句,在进行一些先期的预处理以后,命令被解释执行以前,会对其中用百分号闭合的字符串进行匹配,若是在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号自己,若是未获得匹配,则用一个空串替换,这个过程就是环境变量的“扩展”,它仍然属于命令行的预处理范畴。命令行
而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等链接起来的复合语句。设计
所以,当CMD读取for语句时,其后用一对圆扩号闭合的全部语句将一同读取,并完成必要的预处理工做,这其中就包括环境变量的扩展,因此在for中的全部语句执行以前,全部的环境变量都已经被替换为for以前所设定的值,从而成为一个字符串常量,而再也不是变量。不管在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非for语句内部。字符串
而为了可以在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句以后,它不会当即执行变量的扩展行为,而会在某个单条语句执行以前再进行扩展,也就是说,这个扩展行为被“延迟”了。it
延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:on,它会打开一个新的命令行外壳,在使用exit退出这个外壳以前,扩展特性始终有效,经常使用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal以后,扩展特性和以前对环境变量的修改将一同消失,经常使用于批处理语句中。io