找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23357|回复: 14

[文件操作] 大神帮忙批处理重命名文件语句差错

[复制链接]
发表于 2021-6-20 14:01:11 | 显示全部楼层 |阅读模式
  1. @echo on

  2. set alist=A.txt
  3. set blist=B.txt

  4. for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  5.   if exist %%a:\*.* (
  6.     for %%b in (0 1 2 3 4 5 6 7 8 9) do (
  7.       if exist %%a:\song%%b\*.* (
  8.         for /f "tokens=1,2,3,4,5,6* delims=" %%c in (alist.txt) do (
  9.           if exist %%a:\song%%b\%%c.* (
  10.             for /f "tokens=1,2,3,4,5,6* delims=" %%d in (blist.txt) do (
  11.               if exist %%a:\song%%b\%%c.* ren %%a:\song%%b\%%c.* %%d.*
  12.             )
  13.           )
  14.         )
  15.       )
  16.     )
  17.   )
  18. )

  19. @echo on


  20. pause
复制代码
运行批处理后文件名不正常,有按照A.txt---B.txt去改但是有重名文件
求大神帮忙解决,万分感谢
 楼主| 发表于 2021-6-20 14:06:11 | 显示全部楼层
A.txt内容
AS0000
AS0001
AS0002
AS0003
AS0004
AS0005
AS0006
AS0007
AS0008
AS0009
AS0010
AS0011
AS0012
AS0013
AS0014
AS0015
AS0016

B.txt内容
M00000
M00001
M00002
M00003
M00004
M00005
M00006
M00007
M00008
M00009
M00010
M00011
M00012
M00013
M00014
M00015
M00016

最后结果
M00000
M00000
M00000
M00000
M00000
M00001
M00001
M00002
M00003
M00004
M00005
M00006
M00007
M00008
M00009
M00010
M00011
发表于 2021-6-20 15:56:24 | 显示全部楼层
  1. for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  2.   if exist %%a:\*.* (
  3.     for %%b in (0 1 2 3 4 5 6 7 8 9) do (
  4.       if exist %%a:\song%%b\*.* (
  5.         for /f %%c in (alist.txt) do (
  6.           if exist %%a:\song%%b\%%c.* (
  7.                set /p d=
  8.                ren %%a:\song%%b\%%c.* !d!.*
  9.             )
  10.         )<blist.txt
  11.       )
  12.     )
  13.   )
  14. )
复制代码
 楼主| 发表于 2021-6-20 16:14:18 | 显示全部楼层
回复 3# newswan


   感谢大哥帮忙,刚测试了一下文件有4-5个文件名变成!d!了,其余的文件名没有变化我只是想把A.txt里面的AS0000-AS0016变成M00000-M00016不是把AS0000-AS0016变成!d!
发表于 2021-6-20 16:33:20 | 显示全部楼层
  1. setlocal ENABLEDELAYEDEXPANSION

  2. for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  3.   if exist %%a:\*.* (
  4.     for %%b in (0 1 2 3 4 5 6 7 8 9) do (
  5.       if exist %%a:\song%%b\*.* (
  6.         call :f %%a:\song%%b
  7.       )
  8.     )
  9.   )
  10. )

  11. :f
  12. for /f %%c in (alist.txt) do (
  13.     if exist %1\%%c.* (
  14.         set /p d=
  15.         echo ren %%a:\song%%b\%%c.* !d!.*
  16.     )
  17. )<blist.txt
  18. goto :eof

  19. :END
复制代码
需要变量延迟,也许需要改成函数调用
 楼主| 发表于 2021-6-20 18:22:56 | 显示全部楼层
本帖最后由 taoqixfz 于 2021-6-20 18:24 编辑

回复 5# newswan


   还是不对运行完批处理文件名没变化
发表于 2021-6-20 18:50:33 | 显示全部楼层
回复 6# taoqixfz


    看命令输出 ,如果正确, 把 echo ren 前面 echo 删除
 楼主| 发表于 2021-6-20 19:15:12 | 显示全部楼层
回复 7# newswan
现在已经让我整理成这样了,貌似差一个%%d的赋值
@echo on
@rem 指定原文件名列表文件
set alist=A.txt

@rem 指定新文件名列表文件
set blist=B.txt


for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  if exist %%a:\*.* (
    for %%b in (0 1 2 3 4 5 6 7 8 9) do (
      if exist %%a:\song%%b\*.* (
        for /f %%c in (%alist%) do (
          if exist %%a:\song%%b\%%c.* ren %%a:\song%%b\%%c.* %%d.*
        )
      )
    )
  )
)

@echo on


pause
发表于 2021-6-20 19:17:34 | 显示全部楼层
本帖最后由 newswan 于 2021-6-20 19:24 编辑

回复 8# taoqixfz

%%d 来自 a.txt
用 set /p d= 和 <b.txt 得到 !d!

要么,你把 a.txt 和 b.txt 合并
 楼主| 发表于 2021-6-20 19:30:59 | 显示全部楼层
回复 9# newswan


   合并倒是也可以但是我不会弄
AS0000.*M00000.*
AS0001.*M00001.*
AS0002.*M00002.*
AS0003.*M00003.*
AS0004.*M00004.*
AS0005.*M00005.*
AS0006.*M00006.*
AS0007.*M00007.*
AS0008.*M00008.*
AS0009.*M00009.*
AS0010.*M00010.*
AS0011.*M00011.*
AS0012.*M00012.*
AS0013.*M00013.*
AS0014.*M00014.*
AS0015.*M00015.*
AS0016.*M00016.*
发表于 2021-6-20 20:04:41 | 显示全部楼层
  1. AS0000        M00000
  2. AS0001        M00001
  3. AS0002        M00002
  4. AS0003        M00003
  5. AS0004        M00004
  6. AS0005        M00005
  7. AS0006        M00006
  8. AS0007        M00007
  9. AS0008        M00008
  10. AS0009        M00009
  11. AS0010        M00010
  12. AS0011        M00011
  13. AS0012        M00012
  14. AS0013        M00013
  15. AS0014        M00014
  16. AS0015        M00015
  17. AS0016        M00016
复制代码
发表于 2021-6-20 20:06:46 | 显示全部楼层

  1. for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  2.   if exist %%a:\*.* (
  3.     for %%b in (0 1 2 3 4 5 6 7 8 9) do (
  4.       if exist %%a:\song%%b\*.* (
  5.         for /f "tokens=1,2 delims= " %%c in (c.txt) do (
  6.           if exist %%a:\song%%b\%%c.* ren %%a:\song%%b\%%c.* %%d.*
  7.         )
  8.       )
  9.     )
  10.   )
  11. )
复制代码
发表于 2021-6-21 12:25:21 | 显示全部楼层
回复 1# taoqixfz
代码存在以下问题:
1.判断语句太多,效率低,有些是可以合并的。
2.代码第7、9行中"\*.*"不会起任何作用。
3.如果像2楼的情况正常不会出现重名文件,可能是ren语句中.*所致。
4.如果改名像2楼所示那么有规律,就不需要A.txt、B.txt来指定文件名。可直接修改文件名更简单。
发表于 2021-6-21 12:55:22 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-6-21 15:48 编辑

回复 2# taoqixfz
2楼情况,不用文本文件直接修改文件名:
  1. @echo off
  2. set var1=AS
  3. set var2=M0
  4. setlocal enabledelayedexpansion
  5. for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  6.     for /l %%b in (0,1,9) do (
  7.         if exist %%a:\song%%b (
  8.             pushd "%%a:\song%%b"
  9.             for %%c in (%var1%*.*) do (
  10.                 set "str=%%c"
  11.                 set "str=!str:*%var1%=%var2%!"
  12.                 ren "%%c" "!str!"
  13.             )
  14.             popd
  15.         )
  16.     )
  17. )
  18. pause
复制代码
未测试。
发表于 2021-6-21 13:03:57 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-6-21 15:47 编辑

针对2楼情况简单点:
  1. @echo off
  2. for %%a in (D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  3.     for /l %%b in (0,1,9) do (
  4.         if exist %%a:\song%%b (
  5.             pushd "%%a:\song%%b"
  6.             ren AS* M0* 2>nul
  7.             popd
  8.         )
  9.     )
  10. )
  11. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 18:34 , Processed in 0.032844 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表