Board logo

标题: [文件操作] [已解决]批处理怎样提取目录名中括号内的字符串并以该字符串重命名目录下所有文件? [打印本页]

作者: go3up    时间: 2014-1-10 15:21     标题: [已解决]批处理怎样提取目录名中括号内的字符串并以该字符串重命名目录下所有文件?

本帖最后由 pcl_test 于 2016-7-22 19:45 编辑

想求个好用的批处理,找高手。

我有一些目录是这样:     (AA55)中国风
里面有一些文件都是随机名字,比如:456487A789.jpg

想通过批处理,提取目录名中括号内的内容AA55,将目录中的文件修改成这个提取的名字,也就是改为AA55.jpg

请教高手指导。
作者: 522235677    时间: 2014-1-10 15:57

你没说修改哪些文件啊
哪个文件要改为AA55?
作者: go3up    时间: 2014-1-14 11:17

举例:
目录是:(AA55)中国风
目录中有两个文件,名字是不规则的,比如:789.jpg,abd.png。

这些文件的扩展名都不同,现在要将目录中的所有文件都改为:目录名的括号内的文字。改完后,文件名应该是这样:AA55.jpg             AA55.png
作者: DAIC    时间: 2014-1-14 15:24

假设文件夹“(AA55)中国风”位于 C:\test\ 目录下面
请把这个批处理也放在 C:\test\ 目录下面
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad ^| findstr "(.*)"') do (
  4.     for /f "tokens=2 delims=()" %%j in ("%%i") do (
  5.         set str=%%j
  6.     )
  7.     for /f "delims=" %%k in ('dir /b /a-d "%%i"') do (
  8.         ren "%%i\%%k" "!str!%%~xk"
  9.     )
  10. )
复制代码

作者: go3up    时间: 2014-1-15 08:28

DAIC你好,谢谢你提供的方案啊,不过执行结果和我的要求有偏差,可能我没说清楚。

目录名:(AA55)中国风。
里面的文件是789.jpg,abd.png。
改名后,要达到的效果是:AA55.jpg,AA55.png
也就是说,要提取括号内的文本AA55,并用这个来命名目录内的文件。

麻烦您再帮我看看,需要如何修改,非常感谢。
作者: DAIC    时间: 2014-1-15 08:40

回复 5# go3up


    具体的偏差是什么?
作者: DAIC    时间: 2014-1-15 08:42

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad ^| findstr "(.*)"') do (
  4.     for /f "delims=()" %%j in ("%%i") do (
  5.         set str=%%j
  6.     )
  7.     for /f "delims=" %%k in ('dir /b /a-d "%%i"') do (
  8.         ren "%%i\%%k" "!str!%%~xk"
  9.     )
  10. )
复制代码

作者: go3up    时间: 2014-1-15 09:07

啊,回复真快,谢谢DAIC,您真心是个高手。这个问题都困扰了我好久了。现在一层目录已经有效了。

能再麻烦您一下么,当此类目录有多层的时候,如何实现多层修改?

目录:(AA55)中国风
    |
    |---- (BB66)女歌手
        |
        |---- 456.jpg      666.png

能否在第一层目录:(AA55)中国风  里,执行一次批处理,就能将下层子目录的文件也改为符合规律的文字呢?以这个例子来说,就是改为BB66.jpg了
作者: go3up    时间: 2014-1-15 09:23

还有,如果不是圆括号,而是:[    ]       这样的直括号,要怎么修改呢?您有QQ么,能否直接加一下。
我的QQ:33401780
作者: go3up    时间: 2014-1-15 09:38

我还有一些目录是:[STD-105]南城项目。里面的文件也是要改成直括号内的文字。我修改了一下你发的脚本:    for /f "delims=[]" %%j in ("%%i") do        但是没成功。

方便的话,加我的QQ吧:33401780,麻烦您了。
作者: Batcher    时间: 2014-1-15 09:56

回复 8# go3up
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad ^| findstr "(.*)"') do (
  4.     REM Level one folder
  5.     for /f "delims=()" %%j in ("%%i") do (
  6.         set strLevelOne=%%j
  7.     )
  8.     for /f "delims=" %%k in ('dir /b /a-d "%%i"') do (
  9.         ren "%%i\%%k" "!strLevelOne!%%~xk"
  10.     )
  11.     REM Level two folder
  12.     for /f "delims=" %%l in ('dir /b /ad "%%i" ^| findstr "(.*)"') do (
  13.         for /f "delims=()" %%m in ("%%l") do (
  14.             set strLevelTwo=%%m
  15.         )
  16.         for /f "delims=" %%n in ('dir /b /a-d "%%i\%%l"') do (
  17.             ren "%%i\%%l\%%n" "!strLevelTwo!%%~xn"
  18.         )
  19.     )
  20. )
复制代码

作者: Batcher    时间: 2014-1-15 10:08

回复 10# go3up


除了delims要改,findstr也要改。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad ^| findstr "\[.*\]"') do (
  4.     for /f "delims=[]" %%j in ("%%i") do (
  5.         set str=%%j
  6.     )
  7.     for /f "delims=" %%k in ('dir /b /a-d "%%i"') do (
  8.         ren "%%i\%%k" "!str!%%~xk"
  9.     )
  10. )
复制代码

作者: go3up    时间: 2014-1-15 10:11

谢谢,Batcher,双层目录的问题解决了。顺便问一下,只能每加一层目录,就多一段代码么?没有自动循环递归的方法么?

另外,10楼的时候我问的那个问题,也麻烦您指教一下:就是目录名为方括号的,应该如何修改代码呢?

[STD-105]南城项目     这样的目录名。需求是一样的,用方括号内的文字,修改目录内的文件名。
作者: go3up    时间: 2014-1-15 10:14

太感谢了,虽然还没完全吃透,但套用您提供的这个脚本,我的工作已经能先做了。等有闲我再好好研究一下语句的内容,争取也能自己写出这样的代码。

谢谢两位大侠的帮助!
作者: Batcher    时间: 2014-1-15 10:57

回复 14# go3up


    问题解决后,请编辑顶楼帖子在标题前面注明[已解决],并给回答者加分。
作者: go3up    时间: 2014-1-15 11:18

啊,管理员,我只能评一分,先给了DIAC了,本来要给您也加分的。
明天我再给您加分吧,谢谢了。您二位都帮了我大忙了。
作者: terse    时间: 2014-1-15 15:32

回复 13# go3up
楼主所谓自动递归 是指遍历子目录吧
  1. @echo off&setlocal enabledelayedexpansion
  2. set ph=c:\text\
  3. pushd "%ph%"
  4. for /f "delims=" %%i in ('dir /b /s /ad "*(*)*.*" "*[*]*.*"') do (
  5.     set "str=%%~nxi"
  6.     set "str=!str:*(=!"
  7.     for /f "delims=)]" %%j in ("!str:*[=!") do ren "%%i\*.*" "%%j.*"
  8. )
  9. popd
  10. pause
复制代码

作者: go3up    时间: 2014-1-16 09:46

楼上强人,谢谢,就是遍历的意思。又学一招,非常感谢。




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