Board logo

标题: [文件操作] 直接用for遍历文件的奇怪现象 [打印本页]

作者: 随风    时间: 2008-3-23 22:38     标题: 直接用for遍历文件的奇怪现象

直接用for遍历文件的奇怪现象
一个奇怪的问题,测试以下代码,为何会把文件循环两次?
按道理显示的应该是3456789.dst才对啊?
测试代码: 注意:会删除当前目录的所有dst文件。
:
  1. @echo off
  2. for %%a in (*.dst) do del %%a 2>nul
  3. cd.>123456789.dst
  4. setlocal enabledelayedexpansion
  5. for %%a in (*.dst) do (
  6.   set "name=%%a"
  7.   ren "%%a" "!name:~2!"
  8. )
  9. echo.
  10. for %%a in (*.dst) do echo %%a
  11. echo\&pause
复制代码

作者: fml520    时间: 2008-3-31 12:36

看不懂,还请解释,学习中
作者: mokmao    时间: 2008-3-31 16:35

cd.>123456789.dst 这句看不懂 麻烦讲下 在下菜鸟
作者: fml520    时间: 2008-4-2 12:46

原帖由 mokmao 于 2008-3-31 16:35 发表
cd.>123456789.dst 这句看不懂 麻烦讲下 在下菜鸟


cd.>123456789.dst  意思是创建一个空的123456789.dst  文件
作者: hlzj88    时间: 2008-11-12 22:25

这个是不是和那个%%%%%%%同样道理啊,虽然两个都不明白,
作者: zqz0012005    时间: 2008-11-12 22:47

好像早已讨论过,是for的一个bug
作者: Batcher    时间: 2008-11-13 14:17     标题: 回复 7楼 的帖子

能否请你这位高人来解答一下?
等我学会以后,我也去大笑别人的回答,哈哈。
作者: pusofalse    时间: 2008-11-13 14:45     标题: 回复 7楼 的帖子

劝你说话不要太嚣张,否则只会显露出自己的弱小与无能而已。。。^_^
作者: everest79    时间: 2008-11-13 20:36

七楼的左买弄右买弄到底是个什么鸡巴玩意
作者: more    时间: 2008-11-14 20:06

经本人用下面的两个代码测试有了一点小发现,但还不完全...
    两个代码的区别在于生成的文件名的大小和重命名文件后所形成的文件名的大小
    下面就说说我的分析吧:
    运行代码1形成的文件为123456789.dst,重命名后变成3456789.dst,由于for还要按顺序进

行文件的查找,这样会再找到重命名后的3456789.dst,这样会再把3456789.dst命名为

56789.dst,但是为什么不再把56789.dst重命名,本人无解,期待高手...
    运行代码2形成的文件为341256789.dst,重命名后变成1256789.dst,由于for是按顺序进行

查找的,先前已经从以3开头的文件开始找了,重命名后的文件12356789.dst的开头1已经比3小,

所以批处理结束.
    以上是本人的一点愚见,如有不足,请各位指正,补充...
代码1:
  1. :@echo off
  2. del *.dst >nul 2>nul
  3. cd.>123456789.dst
  4. setlocal enabledelayedexpansion
  5. for %%a in (*.dst) do (
  6.   echo %%a
  7.   set "name=%%a"
  8.   ren "%%a" "!name:~2!"
  9. )
  10. pause
复制代码
代码2:
  1. :@echo off
  2. del *.dst >nul 2>nul
  3. cd.>341256789.dst
  4. setlocal enabledelayedexpansion
  5. for %%a in (*.dst) do (
  6.   echo %%a
  7.   set "name=%%a"
  8.   ren "%%a" "!name:~2!"
  9. )
  10. pause
复制代码

作者: more    时间: 2008-11-14 21:01

再用下面的代码进行测试,本以为会对一个文件进行多次重命名的,但只对第一个被重命名的文件进行了两次处理,其它的都只重命名了一次,也许正如6楼说的是for的一个bug吧...
  1. del *.dst >nul 2>nul
  2. set "str=123456789abcdefg"
  3. :agn
  4. cd.>%str%.dst
  5. set /a n+=1
  6. if "%n%"=="10" goto :ren_
  7. set "str=%str:~1%%str:~,1%"
  8. goto :agn
  9. :ren_
  10. for %%a in (*.dst) do (
  11.   echo %%a
  12.   set "name=%%a"
  13.   setlocal enabledelayedexpansion
  14.   ren "%%a" "!name:~2!"
  15.   endlocal
  16. )
  17. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2