批处理 for 的问题
@echooffseta=0for/l%%iin(1,1,100)do(set/aa+=1&echo%a%)pause为什么一直显示0啊...
@echo off
set a=0
for /l %%i in (1,1,100) do (
set /a a+=1&echo %a%
)
pause
为什么一直显示 0 啊 展开
set a=0
for /l %%i in (1,1,100) do (
set /a a+=1&echo %a%
)
pause
为什么一直显示 0 啊 展开
展开全部
你试下这个
setLocal EnableDelayedExpansion
@echo off
set a=0
for /l %%i in (1,1,100) do (
set /a a+=1&echo !a!
)
pause
要启用"环境变量延迟扩展"
一点资料:
关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽
,而且有数个代码示例,应该不难理解。在此仅略作一些补充。
在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度
进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。
而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进
行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”
,它仍然属于命令行的预处理范畴。
而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。
因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,
所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非
for语句内部。
而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,
而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。
延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off(此处说法有误,应为 CMD /v:on——namejm 注),它会打开一个新的命令行外
壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之
后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。
set /?的中文帮助看得似懂非懂,主要是里面有几个生涩的术语,看了willsort的解释之后,才明白"扩展"原来就是常用的引用、调用之类的动作,有种恍然大悟的感觉.
还有在需要使用变量里套变量也可以使用变量延迟,如:
setLocal EnableDelayedExpansion
set a=1000
set b=dd
set a%b%=9000
set c=!a%b%!
echo %a% %b% !a%b%!
pause
总之,凡是要在for语句后,再次调用你原先定义的变量,你就要用变量延迟
要是回答的内容有问题,或认为不妥,请发送百度消息给我,消息内容加上本页网址哦。。
·
setLocal EnableDelayedExpansion
@echo off
set a=0
for /l %%i in (1,1,100) do (
set /a a+=1&echo !a!
)
pause
要启用"环境变量延迟扩展"
一点资料:
关于环境变量延迟扩展,使用set /?可以查看到部分说明,不过考虑到其粗劣的翻译水平,建议在查看之前,首先chcp 437切换为英文查看原英文说明。鉴于文中已说得十分详尽
,而且有数个代码示例,应该不难理解。在此仅略作一些补充。
在许多可见的官方文档中,均将使用一对百分号闭合环境变量以完成对其值的替换行为称之为“扩展(expansion)”,这其实是一个第一方的概念,是从命令解释器的角度
进行称谓的,而从我们使用者的角度来看,则可以将它看作是引用(Reference)、调用(Call)或者获取(Get)。
而命令解释器是扩展环境变量的行为大致如下:首先读取命令行的一条完整语句,在进行一些先期的预处理之后,命令被解释执行之前,会对其中用百分号闭合的字符串进
行匹配,如果在环境空间中找到了与字符串相匹配的环境变量,则用其值替换掉原字符串及百分号本身,如果未得到匹配,则用一个空串替换,这个过程就是环境变量的“扩展”
,它仍然属于命令行的预处理范畴。
而一条“完整的语句”,在NT的命令解释器CMD中被解释为“for if else”等含有语句块的语句和用“& | && ||”等连接起来的复合语句。
因此,当CMD读取for语句时,其后用一对圆扩号闭合的所有语句将一同读取,并完成必要的预处理工作,这其中就包括环境变量的扩展,所以在for中的所有语句执行之前,
所有的环境变量都已经被替换为for之前所设定的值,从而成为一个字符串常量,而不再是变量。无论在for中将那些环境变量如何修改,真正受到影响的只是环境变量空间,而非
for语句内部。
而为了能够在for语句内部感知环境变量的动态变化,CMD设计了延迟的环境变量扩展特性,也就是说,当CMD读取了一条完整的语句之后,它不会立即执行变量的扩展行为,
而会在某个单条语句执行之前再进行扩展,也就是说,这个扩展行为被“延迟”了。
延迟环境变量扩展特性在CMD中缺省是关闭的,开启它的方法目前有两个:一是CMD /v:off(此处说法有误,应为 CMD /v:on——namejm 注),它会打开一个新的命令行外
壳,在使用exit退出这个外壳之前,扩展特性始终有效,常用于命令行环境中;二是setlocal EnableDelayedExpansion,它会使环境变量的修改限制到局部空间中,在endlocal之
后,扩展特性和之前对环境变量的修改将一同消失,常用于批处理语句中。
set /?的中文帮助看得似懂非懂,主要是里面有几个生涩的术语,看了willsort的解释之后,才明白"扩展"原来就是常用的引用、调用之类的动作,有种恍然大悟的感觉.
还有在需要使用变量里套变量也可以使用变量延迟,如:
setLocal EnableDelayedExpansion
set a=1000
set b=dd
set a%b%=9000
set c=!a%b%!
echo %a% %b% !a%b%!
pause
总之,凡是要在for语句后,再次调用你原先定义的变量,你就要用变量延迟
要是回答的内容有问题,或认为不妥,请发送百度消息给我,消息内容加上本页网址哦。。
·
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询