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

[文件操作] BAT两个for循环嵌套,两个变量值为什么会重复?

在E:\下有一个文件夹:E:\测试照片批量重命名,在这个文件夹下存放着一个照片文件夹:E:\测试照片批量重命名\0,一个存入学生信息的EXCEL数据表另存而得的以制表符分隔的文本文件:E:\测试照片批量重命名\3.txt。
现在我想从3.txt文件中跳过前面6行提取第二列的数据:学生姓名,把E:\测试照片批量重命名\0  文件夹下的照片名批量以学生姓名重新命名。
因为是测试,所以我把文件夹里的照片和学生信息表中的数据都只保留了8个学生的信息。我的代码是这样的:
1、第一次测试:
  1. echo on
  2. setlocal enabledelayedexpansion
  3. for /f "delims=U" %%a in ('cmd /u/c echo 唉') do set "tab=%%a"
  4. if exist a.txt del a.txt
  5. if exist b.bat del b.bat
  6. cd /d "E:\测试照片批量重命名\0"
  7. dir /b/od>"E:\测试照片批量重命名\a.txt"
  8. for /f "skip=6 tokens=2 delims=%tab%" %%i in ('type "E:\测试照片批量重命名\3.txt"') do (
  9. for /f "tokens=1 delims=" %%b in (E:\测试照片批量重命名\a.txt) do echo ren "%%b" "%%i.jpg">>"E:\测试照片批量重命名\b.bat")
复制代码
运行后,在b.bat中得到的结果怎么会是下面这样呢?每一个学生的名字为什么会重复出现与每一张照片名对应呢?然后每一张照片再重复也每一个学生的名字对应一次,也就是%%i的第一个值会重复出现与%%b的每一个值对应一次,然后%%i的第二个值再重复出现与%%b的每一个值对应一次,然后是%%i的第三个值重复出现与%%b的每一个值对应,一直这样直到%%i的最后一个值。
ren "DSC01820.JPG" "张灿.jpg"
ren "DSC01821.JPG" "张灿.jpg"
ren "DSC01822.JPG" "张灿.jpg"
ren "DSC01823.JPG" "张灿.jpg"
ren "DSC01824.JPG" "张灿.jpg"
ren "DSC01825.JPG" "张灿.jpg"
ren "DSC01826.JPG" "张灿.jpg"
ren "DSC01827.JPG" "张灿.jpg"
ren "DSC01820.JPG" "王宇.jpg"
ren "DSC01821.JPG" "王宇.jpg"
ren "DSC01822.JPG" "王宇.jpg"
ren "DSC01823.JPG" "王宇.jpg"
ren "DSC01824.JPG" "王宇.jpg"
ren "DSC01825.JPG" "王宇.jpg"
ren "DSC01826.JPG" "王宇.jpg"
ren "DSC01827.JPG" "王宇.jpg"
ren "DSC01820.JPG" "李俊辉.jpg"
ren "DSC01821.JPG" "李俊辉.jpg"
ren "DSC01822.JPG" "李俊辉.jpg"
ren "DSC01823.JPG" "李俊辉.jpg"
ren "DSC01824.JPG" "李俊辉.jpg"
ren "DSC01825.JPG" "李俊辉.jpg"
ren "DSC01826.JPG" "李俊辉.jpg"
ren "DSC01827.JPG" "李俊辉.jpg"
ren "DSC01820.JPG" "谢李洋.jpg"
ren "DSC01821.JPG" "谢李洋.jpg"
ren "DSC01822.JPG" "谢李洋.jpg"
ren "DSC01823.JPG" "谢李洋.jpg"
ren "DSC01824.JPG" "谢李洋.jpg"
ren "DSC01825.JPG" "谢李洋.jpg"
ren "DSC01826.JPG" "谢李洋.jpg"
ren "DSC01827.JPG" "谢李洋.jpg"
ren "DSC01820.JPG" "江豪.jpg"
ren "DSC01821.JPG" "江豪.jpg"
ren "DSC01822.JPG" "江豪.jpg"
ren "DSC01823.JPG" "江豪.jpg"
ren "DSC01824.JPG" "江豪.jpg"
ren "DSC01825.JPG" "江豪.jpg"
ren "DSC01826.JPG" "江豪.jpg"
ren "DSC01827.JPG" "江豪.jpg"
ren "DSC01820.JPG" "杨宣坤.jpg"
ren "DSC01821.JPG" "杨宣坤.jpg"
ren "DSC01822.JPG" "杨宣坤.jpg"
ren "DSC01823.JPG" "杨宣坤.jpg"
ren "DSC01824.JPG" "杨宣坤.jpg"
ren "DSC01825.JPG" "杨宣坤.jpg"
ren "DSC01826.JPG" "杨宣坤.jpg"
ren "DSC01827.JPG" "杨宣坤.jpg"
ren "DSC01820.JPG" "李潇.jpg"
ren "DSC01821.JPG" "李潇.jpg"
ren "DSC01822.JPG" "李潇.jpg"
ren "DSC01823.JPG" "李潇.jpg"
ren "DSC01824.JPG" "李潇.jpg"
ren "DSC01825.JPG" "李潇.jpg"
ren "DSC01826.JPG" "李潇.jpg"
ren "DSC01827.JPG" "李潇.jpg"
ren "DSC01820.JPG" "钱森.jpg"
ren "DSC01821.JPG" "钱森.jpg"
ren "DSC01822.JPG" "钱森.jpg"
ren "DSC01823.JPG" "钱森.jpg"
ren "DSC01824.JPG" "钱森.jpg"
ren "DSC01825.JPG" "钱森.jpg"
ren "DSC01826.JPG" "钱森.jpg"
ren "DSC01827.JPG" "钱森.jpg"


2、第二次测试:我又把代码作了一下修改,调换了两个for的位置:
  1. echo on
  2. setlocal enabledelayedexpansion
  3. for /f "delims=U" %%a in ('cmd /u/c echo 唉') do set "tab=%%a"
  4.   if exist a.txt del a.txt
  5.   if exist b.bat del b.bat
  6. pause
  7.   cd /d "E:\测试照片批量重命名\0"
  8.   dir /b/od>"E:\测试照片批量重命名\a.txt"
  9.   for /f "tokens=1 delims=" %%b in (E:\测试照片批量重命名\a.txt) do (
  10.   for /f "skip=6 tokens=2 delims=%tab%" %%i in ('type "E:\测试照片批量重命名\3.txt"') do echo ren "%%b" "%%i.jpg">>"E:\测试照片批量重命名\b.bat")
复制代码
这时运行后在b.bat中得到的结果是下面这样的,是%%b的第一个值重复出现与每一个%%i的值对应一次,然后%%b的第二个值重复出现对应%%i的每一个值,直到最后一个%%b的值。结果如下:

ren "DSC01820.JPG" "张灿.jpg"
ren "DSC01820.JPG" "王宇.jpg"
ren "DSC01820.JPG" "李俊辉.jpg"
ren "DSC01820.JPG" "谢李洋.jpg"
ren "DSC01820.JPG" "江豪.jpg"
ren "DSC01820.JPG" "杨宣坤.jpg"
ren "DSC01820.JPG" "李潇.jpg"
ren "DSC01820.JPG" "钱森.jpg"
ren "DSC01821.JPG" "张灿.jpg"
ren "DSC01821.JPG" "王宇.jpg"
ren "DSC01821.JPG" "李俊辉.jpg"
ren "DSC01821.JPG" "谢李洋.jpg"
ren "DSC01821.JPG" "江豪.jpg"
ren "DSC01821.JPG" "杨宣坤.jpg"
ren "DSC01821.JPG" "李潇.jpg"
ren "DSC01821.JPG" "钱森.jpg"
ren "DSC01822.JPG" "张灿.jpg"
ren "DSC01822.JPG" "王宇.jpg"
ren "DSC01822.JPG" "李俊辉.jpg"
ren "DSC01822.JPG" "谢李洋.jpg"
ren "DSC01822.JPG" "江豪.jpg"
ren "DSC01822.JPG" "杨宣坤.jpg"
ren "DSC01822.JPG" "李潇.jpg"
ren "DSC01822.JPG" "钱森.jpg"
ren "DSC01823.JPG" "张灿.jpg"
ren "DSC01823.JPG" "王宇.jpg"
ren "DSC01823.JPG" "李俊辉.jpg"
ren "DSC01823.JPG" "谢李洋.jpg"
ren "DSC01823.JPG" "江豪.jpg"
ren "DSC01823.JPG" "杨宣坤.jpg"
ren "DSC01823.JPG" "李潇.jpg"
ren "DSC01823.JPG" "钱森.jpg"
ren "DSC01824.JPG" "张灿.jpg"
ren "DSC01824.JPG" "王宇.jpg"
ren "DSC01824.JPG" "李俊辉.jpg"
ren "DSC01824.JPG" "谢李洋.jpg"
ren "DSC01824.JPG" "江豪.jpg"
ren "DSC01824.JPG" "杨宣坤.jpg"
ren "DSC01824.JPG" "李潇.jpg"
ren "DSC01824.JPG" "钱森.jpg"
ren "DSC01825.JPG" "张灿.jpg"
ren "DSC01825.JPG" "王宇.jpg"
ren "DSC01825.JPG" "李俊辉.jpg"
ren "DSC01825.JPG" "谢李洋.jpg"
ren "DSC01825.JPG" "江豪.jpg"
ren "DSC01825.JPG" "杨宣坤.jpg"
ren "DSC01825.JPG" "李潇.jpg"
ren "DSC01825.JPG" "钱森.jpg"
ren "DSC01826.JPG" "张灿.jpg"
ren "DSC01826.JPG" "王宇.jpg"
ren "DSC01826.JPG" "李俊辉.jpg"
ren "DSC01826.JPG" "谢李洋.jpg"
ren "DSC01826.JPG" "江豪.jpg"
ren "DSC01826.JPG" "杨宣坤.jpg"
ren "DSC01826.JPG" "李潇.jpg"
ren "DSC01826.JPG" "钱森.jpg"
ren "DSC01827.JPG" "张灿.jpg"
ren "DSC01827.JPG" "王宇.jpg"
ren "DSC01827.JPG" "李俊辉.jpg"
ren "DSC01827.JPG" "谢李洋.jpg"
ren "DSC01827.JPG" "江豪.jpg"
ren "DSC01827.JPG" "杨宣坤.jpg"
ren "DSC01827.JPG" "李潇.jpg"
ren "DSC01827.JPG" "钱森.jpg"

请高手帮忙分析一下,为什么会出现这样的情况呢?为什么第一个for的变量的值会重复出现呢?两个for的变量值为什么不同步呢?

3、第三次测试:在一位热心网友的帮助下,帮我修改了一下代码,运行后在b.bat文件中能得到正确结果,没有重复,但是在CMD窗口中同样是重复出现了每一个学生的名字与第一张照片对应,再重复出现与第二照片名对应,运行速度比较慢:代码如下:
  1. @echo on
  2. setlocal enabledelayedexpansion
  3. for /f "delims=U" %%a in ('cmd /u/c echo 唉') do set "tab=%%a"
  4. if exist a.txt del a.txt
  5. if exist b.bat del b.bat
  6. pause
  7. cd /d "E:\测试照片批量重命名\0"
  8. dir /b/od>"E:\测试照片批量重命名\a.txt"
  9. for /f "skip=6 tokens=2 delims=%tab%" %%i in ('type "E:\测试照片批量重命名\3.txt"') do (
  10. set /a n+=1
  11. for /f "tokens=1 delims=" %%b in (E:\测试照片批量重命名\a.txt) do echo %%b>>"E:\测试照片批量重命名\b.bat")
  12. set /a m+=1
  13. if /i "!n!"=="!m!" echo ren "%%b" "%%i.jpg">>"E:\测试照片批量重命名\b.bat")
  14. set m=0)
复制代码
运行后,在b.bat文件中得到的语句如下:
ren "DSC01820.JPG" "张灿.jpg"
ren "DSC01821.JPG" "王宇.jpg"
ren "DSC01822.JPG" "李俊辉.jpg"
ren "DSC01823.JPG" "谢李洋.jpg"
ren "DSC01824.JPG" "江豪.jpg"
ren "DSC01825.JPG" "杨宣坤.jpg"
ren "DSC01826.JPG" "李潇.jpg"
ren "DSC01827.JPG" "钱森.jpg"

可是我用echo on以后,去看CMD窗口,里面同样重复对应过!


4、第四次测试:在一个高手的帮助下,他帮我把代码再次修改成了下面那样,这次运行速度很快,CMD窗口中没有出现重复,运行后在b.bat文件中得到了正确的结果,代码如下:
  1. @echo on&setlocal enabledelayedexpansion
  2. if exist b.bat del b.bat
  3. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  4. cd /d "E:\测试照片批量重命名\0"
  5. (for /f "delims=" %%a in ('echo ##^&echo ##^&dir /b/od *.jpg') do (
  6.      set/p fn=
  7.      if not "%%a"=="##" (  
  8.        for /f "tokens=2 delims=%tab%" %%b in ("!fn!") do echo ren "%%a" "%%b.jpg">>"E:\测试照片批量重命名\b.bat"
  9.      )         
  10. ))<"E:\测试照片批量重命名\3.txt"
  11. pause
复制代码
这时得到了正确的结果:

ren "DSC01820.JPG" "张灿.jpg"
ren "DSC01821.JPG" "王宇.jpg"
ren "DSC01822.JPG" "李俊辉.jpg"
ren "DSC01823.JPG" "谢李洋.jpg"
ren "DSC01824.JPG" "江豪.jpg"
ren "DSC01825.JPG" "杨宣坤.jpg"
ren "DSC01826.JPG" "李潇.jpg"
ren "DSC01827.JPG" "钱森.jpg"

这一次的代码,同样是两个for循环的嵌套啊,怎么运行结果却不相同呢?请高手们帮忙解释一下。

回复 1# 810126769

会重复对应的原因是这样的:
   for /f "skip=6 tokens=2 delims=%tab%" %%i in ('type "E:\测试照片批量重命名\3.txt"') do (
for /f "tokens=1 delims=" %%b in (E:\测试照片批量重命名\a.txt) do echo ren "%%b" "%%i.jpg">>"E:\测试照片批量重命名\b.bat") 我已经找到原因了,这是因为两个for嵌套时, 代码先运行完内层的for命令,这时候内层的for得到的变量就得到全部的值,而外层的for只得到第一个变量的值,运行下一句命令时,也就是运行do echo ren "%%b" "%%i.jpg">>"E:\测试照片批量重命名\b.bat"时,就会用每一个%%b去对应一次外层的for取得的第一个%%i的值。这时,外层的for命令才运行完一次,它再循环运行,去提取%%i的第二个值,取得第二个值时,内层的for也会再运行一次,这样,就会用内层for的值再与外层for的第二个值分别对应一次。依次类推,因此会出现这样的情况。

TOP

返回列表