Board logo

标题: [文件操作] [已解决]批处理文件改名求优化 [打印本页]

作者: 511182890    时间: 2015-5-6 15:50     标题: [已解决]批处理文件改名求优化

本帖最后由 511182890 于 2015-5-8 08:44 编辑

例:这是我所有的文件命名了。
AA2065-G1101-AA-133主副背料(6米48)倒顺.dxf
BB2065-G1101-AA-136副背料(6米48)四向.dxf
CCC2065-G1101-AA-145主料(6米48)双向.dxf
DD2065-G1101-AA五位-136副料(6米48)四向.dxf
FFF2065-G1101-AA五四位-136背料(6米48)四向.dxf
EE2065(共同EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf
ZZ2065(用EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf
执行后结果:
AA2065-G1101-AA-133-主副背料-倒顺-6.48.dxf
BB2065-G1101-AA-136-副背料-四向-6.48.dxf
CCC2065-G1101-AA-145-主料-双向-6.48.dxf
DD2065-G1101-AA五位-136-副料-四向-6.48.dxf
FFF2065-G1101-AA五四位-136-背料-四向-6.48.dxf
EE2065(共同EE2066)-G1101-AA五四位-136-背料-四向-6.48.dxf
ZZ2065(用EE2066)-G1101-AA五四位-136-背料-四向-6.48.dxf
现在已有代码执行之后,前面没有括号的已经成功了
就是EE2065(共同EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf
ZZ2065(用EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf
这二个执行不变的
现有的代码是
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /s /a-d *.dxf') do (
  4.     for /f "tokens=1-3 delims=()" %%i in ("%%~nxa") do (
  5.         set "a=%%i"
  6.         if "!a:主副背料=-主副背料!" neq "%%i" (
  7.             set "a=!a:主副背料=-主副背料!"
  8.         ) else if "!a:副背料=-副背料!" neq "%%i" (
  9.             set "a=!a:副背料=-副背料!"
  10.         ) else (
  11.             set "a=!a:主料=-主料!"
  12.             set "a=!a:副料=-副料!"
  13.             set "a=!a:背料=-背料!"
  14.         )
  15.         set "b=%%j"
  16.         set "b=!b:米=.!"
  17.         set "c=%%k"
  18.         set "d=!c:~3!"
  19.         set "c=!c:~0,2!"
  20.         ren "%%~dpa%%i(%%j)%%k" "!a!-!c!-!b!.!d!"
  21.     )
  22. )
  23. pause
复制代码

作者: cobat    时间: 2015-5-6 16:28

你把改名要求写在帖子里,再把list.txt传上来看看
  1. (@for /r %%a in (*.dxf) do @echo %%~nxa)>list.txt
复制代码

作者: Batcher    时间: 2015-5-6 16:48

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /s /a-d *.dxf') do (
  4.     for /f "tokens=1-2 delims=米" %%i in ("%%~nxa") do (
  5.         :: 长度
  6.         for /f "tokens=1-3 delims=(" %%u in ("%%i") do (
  7.             if "%%w" equ "" (
  8.                 set len1=%%v
  9.             ) else (
  10.                 set len1=%%w
  11.             )
  12.         )
  13.         for /f "delims=)" %%u in ("%%j") do (
  14.             set len2=%%u
  15.         )
  16.         set len=!len1!.!len2!
  17.         
  18.         :: 材料
  19.         set "material=%%i"
  20.         if "!material:主副背料=-主副背料!" neq "%%i" (
  21.             set "material=!material:主副背料=-主副背料!"
  22.         ) else if "!material:副背料=-副背料!" neq "%%i" (
  23.             set "material=!material:副背料=-副背料!"
  24.         ) else (
  25.             set "material=!material:主料=-主料!"
  26.             set "material=!material:副料=-副料!"
  27.             set "material=!material:背料=-背料!"
  28.         )
  29.         set "material=!material:~0,-2!"
  30.         
  31.         :: 方向
  32.         for /f "tokens=2 delims=)." %%u in ("%%j") do (
  33.             set direction=%%u
  34.         )
  35.         
  36.         :: 后缀
  37.         set "ext=%%j"
  38.         set "ext=!ext:~-3!"
  39.         
  40.         ren "%%a" "!material!-!direction!-!len!.!ext!"
  41.     )
  42. )
  43. pause
复制代码

作者: 511182890    时间: 2015-5-6 17:06

回复 3# Batcher


    当前目录可以执行了,所有子目录没有运行成功!
作者: Batcher    时间: 2015-5-6 17:11

回复 4# 511182890


    代码已更新,你再试试。
作者: 511182890    时间: 2015-5-7 08:19

回复 5# Batcher


    执行一次是完成成功的,如果执行二次就把我的文件名全部改成乱的了。
作者: Batcher    时间: 2015-5-7 10:13

回复 6# 511182890


这个问题我已经告诉你如何解决了,为何顶楼要发一个错误的代码呢?
http://www.bathome.net/redirect. ... 5424&pid=167796
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /s /a-d *.dxf ^| findstr "米"') do (
  4.     for /f "tokens=1-2 delims=米" %%i in ("%%~nxa") do (
  5.         :: 长度
  6.         for /f "tokens=1-3 delims=(" %%u in ("%%i") do (
  7.             if "%%w" equ "" (
  8.                 set len1=%%v
  9.             ) else (
  10.                 set len1=%%w
  11.             )
  12.         )
  13.         for /f "delims=)" %%u in ("%%j") do (
  14.             set len2=%%u
  15.         )
  16.         set len=!len1!.!len2!
  17.         
  18.         :: 材料
  19.         set "material=%%i"
  20.         if "!material:主副背料=-主副背料!" neq "%%i" (
  21.             set "material=!material:主副背料=-主副背料!"
  22.         ) else if "!material:副背料=-副背料!" neq "%%i" (
  23.             set "material=!material:副背料=-副背料!"
  24.         ) else (
  25.             set "material=!material:主料=-主料!"
  26.             set "material=!material:副料=-副料!"
  27.             set "material=!material:背料=-背料!"
  28.         )
  29.         set "material=!material:~0,-2!"
  30.         
  31.         :: 方向
  32.         for /f "tokens=2 delims=)." %%u in ("%%j") do (
  33.             set direction=%%u
  34.         )
  35.         
  36.         :: 后缀
  37.         set "ext=%%j"
  38.         set "ext=!ext:~-3!"
  39.         
  40.         ren "%%a" "!material!-!direction!-!len!.!ext!"
  41.     )
  42. )
  43. pause
复制代码

作者: 511182890    时间: 2015-5-7 10:54

回复 7# Batcher


    你的这个代码,执行之后,文件名是:AA2065-G1101-AA-133主副背料(6米48)倒顺.dxf那是正常的,但如果我的文件名是这样的:ZZ2065(用EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf是这样的话,会把我的文件名改掉的
他的那个代码,执行之后,只是跳过了我的这个带有“()"的文件,另外都也是正常更改!
作者: Batcher    时间: 2015-5-7 11:48

回复 8# 511182890


我来解释一下吧:
dir /b /s /a-d *.dxf ^| findstr "米" 是用来解决“重复改名”这个问题的
dir /b /s /a-d *.dxf ^| findstr "米" 是用来解决“无法处理子文件夹”这个问题的

现在7楼的代码有什么问题吗?请举例说明
作者: 511182890    时间: 2015-5-7 12:10

回复 9# Batcher


   这个文件 ZZ2065(用EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf
运行之后变成:ZZ2065--G-用EE2066.101-AA五四位-136背料
作者: Batcher    时间: 2015-5-7 14:02

回复 10# 511182890


我这里测试没有发现问题,你把 ZZ2065(用EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf 的完整路径发出来给我看下

C:\Test>dir /b *.dxf
AA2065-G1101-AA-133主副背料(6米48)倒顺.dxf
ZZ2065(用EE2066)-G1101-AA五四位-136背料(6米48)四向.dxf

C:\Test>test.bat

C:\Test>dir /b *.dxf
AA2065-G1101-AA-133-主副背料-倒顺-6.48.dxf
ZZ2065(用EE2066)-G1101-AA五四位-136-背料-四向-6.48.dxf
作者: apang    时间: 2015-5-7 17:47

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /s /a-d *米*.dxf') do (
  3.         set "Name=%%~ni"
  4.         for /f "delims=主副背" %%a in ("!Name!") do (
  5.                 for /f "tokens=1-4 delims=(米)" %%b in ("!Name:%%a=!") do (
  6.                         ren "%%i" "%%a-%%b-%%e-%%c.%%d%%~xi"
  7.                 )
  8.         )
  9. )
  10. pause
复制代码

作者: 511182890    时间: 2015-5-8 08:39

回复 7# Batcher


    谢谢你,你的代码3楼的执行多次就出错了,7楼的完美执行,谢谢你。
作者: 511182890    时间: 2015-5-8 08:40

回复 12# apang


    谢谢你,完美执行。
作者: 511182890    时间: 2015-6-30 15:09

回复 3# Batcher


    http://www.bathome.net/viewthread.php?tid=36307&extra=
帮忙改一下。
作者: 511182890    时间: 2015-8-1 13:26

回复 3# Batcher


    帮忙看看
    http://www.bathome.net/thread-36745-1-1.html




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