[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [讨论]批处理for /l循环体对起点与终点有无影响?

  1. @echo off&color a&setlocal enabledelayedexpansion  
  2. set a=3232
  3. set n=1
  4. for /l %%a in (!a! 1 !a!) do (
  5. set /a n*=10
  6. set /a c=!a!/!n!
  7. if !c! equ 0 (set /a a=!a!-1) else (set str=!str!0&set /a a=!a!+1)
  8. )
  9. echo %str%
  10. echo %a%
  11. pause
复制代码

以上代码执行结果是:
0
3233
请按任意键继续……

---------------------------------------------------------------------------------
由此可见,for /l 循环进入之后,循环体中的对循环起点和终点变量的改变,不再能影响循环的起点和终点…………

不知道我的说法对不对

谈谈我的理解

  1. @echo off&color a&setlocal enabledelayedexpansion  
  2. set a=3232
  3. set n=1
  4. for /l %%a in (!a! 1 !a!) do (
  5. set /a n*=10
  6. set /a c=!a!/!n!
  7. if !c! equ 0 (set /a a=!a!-1) else (set str=!str!0&set /a a=!a!+1)
  8. )
  9. echo %str%
  10. echo %a%
  11. pause
复制代码
分析代码可以看出,你写的这段代码的结果是%str%的值等于0,%a%的值等于3233.原因是什么?其实原因不是你想的那么复杂,什么开始,结尾,改变不改变的. 真正的原因就是: 在for语句之前,并没有给str 赋值,所以%str%的值是0,而%a%之所以是3233,是因为set /a a=!a!+1 这一句.!a!的值是3232,所以%a%的值就是3233.因为!c!的值不会等于0.所以执行set /a a=!a!+1.其实这里的!a!完全可以写成%a%,因为!!一点作用没起到;a的值一直是3232,因为a在for语句中的值一直没有改变过,还是for之前定义的a=3232;所以set /a a=!a!+1 这一句实际上就是a=%a%+1  其中的%a%的值是一开始定义过的3232,所以set /a a=!a!+1 以后
%a%的值就是3233了. 有人可能要问,最后的echo %a%没有在for语句之中,为什么不是3232?也就是为什么echo %a% 显示的不是一开始定义的set a=3232的值.因为,批处理中,执行命令时,变量值的继承是以离自己最近的一层,也就是上一个语句的值来继承的.举个例子这段代码:
  1. @echo off
  2. set a=1
  3. set a=22222
  4. echo %a%
  5. pause
复制代码
你说%a%的值会是什么?一看就明白了!

[ 本帖最后由 bat_521 于 2010-9-24 23:22 编辑 ]

TOP

看看这样

把echo %a% 放到for语句中看看执行结果是什么?
也就是:
  1. @echo off&color a&setlocal enabledelayedexpansion  
  2. set a=3232
  3. set n=1
  4. for /l %%a in (!a! 1 !a!) do (
  5. set /a n*=10
  6. set /a c=!a!/!n!
  7. if !c! equ 0 (set /a a=!a!-1) else (set str=!str!0&set /a a=!a!+1)
  8. echo %a%)
  9. echo %str%
  10. pause
复制代码
看看这样执行的结果是什么?%a%的值是3232,为什么?因为他继承了一开始定义的set a=3232这句的值!有人问为什么%a%的值不是3233了.因为echo %a% 这句是在整个for语句中,for语句是一条语句,是一个整体,要想让一个整体内部的变量感到变化,这就要用到变量延迟了.把代码中echo %a%改为echo !a! 就达到我们的目的了,结果就是3233了.

[ 本帖最后由 bat_521 于 2010-9-24 23:49 编辑 ]

TOP

bat 521你说的对,不过我的本意是要实现从循环体中控制循环的跳出,我们知道for /l %%a in (!a! 1 !a!) do (只会执行一次,我就想,如果从循环体中修改a的值,那么这样是否可以调控循环的继续和中断。
上面这个是要进行位数填充的,比如给一个文本加行号:
0001,……
0002,……
……
0032,……
……
根据文本总行数决定最多填充位数

[ 本帖最后由 skdu7e 于 2010-9-25 08:27 编辑 ]

TOP

回复 4楼 的帖子

在for循环体内部修改控制变量的值,不是一个好主意。
用其它方法吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4楼 的帖子

我还是不清楚你想表达的意思是什么!我总感觉你想的很复杂!你是想在for语句内部让变量的值 随时发生改变?或者说变化成你想要的值?如果是这样的话,那就需要在for语句之外先定义一个a变量的值, 然后在for语句之内再定义a变量的值, 要想使for语句内部a的值起作用,就要开启变量延迟! 不知道我的意思 是不是你想要的意思! 你的意思是想在for语句内部改变a变量的值,然后控制整个for语句的执行次数?

TOP

回复 1楼 的帖子

  1. @echo off
  2. color a
  3. setlocal enabledelayedexpansion  
  4. set /a a=3
  5. :a
  6.   for /l %%a in (1 1 !a!) do (
  7.     for %%b in (a b c) do (
  8.     set /a a+=1
  9.     set/p=%%b<nul
  10.     if "!a!"=="12" goto :a
  11.       
  12. )
  13. echo.
  14. )
  15. pause
复制代码
我举了一个例子,这个例子就是在for语句中当a的值为12时,从新执行一次for语句,这时候for里面的循环次数就改变了!不知道是不是你的意思?

[ 本帖最后由 bat_521 于 2010-9-25 12:09 编辑 ]

TOP

楼主是想实现C语言的for语句?
用bat批处理就不要想了,未知power-shell如何。

TOP

回复 8楼 的帖子

楼主想要实现的效果在4楼有描述
即使是C语言也不建议在for循环体内部修改控制变量的值
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

呵呵,多谢各位,多谢bat 521,呵呵……

TOP

返回列表