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

[文件操作] 直接用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
复制代码
技术问题请到论坛发帖求助!

看不懂,还请解释,学习中
@set,=学无止境
@for /l %%b in (0,1,6) do @call set/p= %%,:~%%b,1%%<nul

TOP

cd.>123456789.dst 这句看不懂 麻烦讲下 在下菜鸟
新手上路  请多指教

TOP

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


cd.>123456789.dst  意思是创建一个空的123456789.dst  文件
@set,=学无止境
@for /l %%b in (0,1,6) do @call set/p= %%,:~%%b,1%%<nul

TOP

这个是不是和那个%%%%%%%同样道理啊,虽然两个都不明白,
目的,学习批处理

TOP

好像早已讨论过,是for的一个bug
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 7楼 的帖子

能否请你这位高人来解答一下?
等我学会以后,我也去大笑别人的回答,哈哈。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 7楼 的帖子

劝你说话不要太嚣张,否则只会显露出自己的弱小与无能而已。。。^_^
心绪平和,眼藏静谧。

TOP

七楼的左买弄右买弄到底是个什么鸡巴玩意

TOP

经本人用下面的两个代码测试有了一点小发现,但还不完全...
    两个代码的区别在于生成的文件名的大小和重命名文件后所形成的文件名的大小
    下面就说说我的分析吧:
    运行代码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
复制代码

TOP

再用下面的代码进行测试,本以为会对一个文件进行多次重命名的,但只对第一个被重命名的文件进行了两次处理,其它的都只重命名了一次,也许正如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
复制代码

TOP

返回列表