Board logo

标题: [文件操作] 【已解决】批处理文件夹及文件夹内部的文件 [打印本页]

作者: miss_sokuber    时间: 2020-10-14 01:00     标题: 【已解决】批处理文件夹及文件夹内部的文件

首先感谢各位能来看我的求助,多谢!~
问题描述:根目录(也就是最上层文件夹)下有多个文件夹,例如名称为1001,1002,1003...,其文件夹下分别有名称为0,1,2,3,4,5的文件夹,然后每个文件夹下都有相同的几个文件夹a,b,h,r,s,最后就是该文件夹下面存有后缀为.png格式的图片了,图片可能有单张或者多张
实现效果:
1。从根目录下开始匹配出文件夹名为a,b,h,r,s的这几个文件夹,把后缀为.png格式的图片重命名为0?001,0?002,0?003...这样,按顺序命名,?代表0,1,2,3,4,5对应的这几个文件夹名称的这个数字+1
2。命名好之后把a,b,h,r,s这几个文件夹移动到父级文件夹下,也就是分别在1001,1002,1003...下,最后把0,1,2,3,4,5这些空文件夹删掉
3。最后把1001,1002,1003...这些文件夹移到另外一个路径下,暂时命名为E:\test,假如没有这个test文件夹则需要创建这个test文件夹
大概就是这样,合起来就是这样的,我先用一个文件夹示例-->1001\(0,1,2,3,4,5)\(a\(a.png,b.png,c.png,d.png,g.png),h\(a.png,b.png,c.png,d.png,g.png),d\(a.png,b.png,c.png,d.png,g.png),r\(a.png,b.png,c.png,d.png,g.png)),
最后改成的结果应该是:1001\(a\(01001.png,01002.png,01003.png,01004.png,01005.png),h\(02001.png,02002.png,02003.png,02004.png,02005.png),d\(03001.png,03002.png,03003.png,03004.png,03005.png),r\(04001.png,04002.png,04003.png,04004.png,04005.png))
其实操作的过程不一定要按上述的顺序,只要结果是对的,步骤可以随意调换,另外需要注意的是子文件夹0,1,2,3,4,5或是a,b,h,r,s,可能只有其中几个,也可能是全部都存在

不知道我的描述是否清晰,感谢各位能帮我解答下,我研究了好久,好迷惑,已经产生了某种思维,没办法入手了,

//================================================================================================//
//================================================================================================//
由于我没有说清楚需求,导致把大家给迷惑了,在这里我给大家道歉了。 :lol 😁😁😁
上述旧需求作废,并以此为戒!!!

我现在搞清楚需求了,是:
1001文件夹下,若有数字文件夹0,1,2,3,4共五个,那么每个子文件夹下都有a,d,h,r,s五个文件夹,每个a,d,h,r,s下都有图片...。
需将0,1,2,3,4下面的a文件夹下的图片合并到新的文件夹,0,1,2,3,4下面的d文件夹下的图片合并到新的文件夹....,有几张就合并几张,并重命名文件,并将新创建的文件夹移到1001文件夹下,后续几个以此类推,最后删除0,1,2,3,4空文件夹。其它依此类推。
图片命名规则:第一个字符是0,第二个字符是0,1,2,3,4这五个文件夹其中一个的名称+1,然后接3个0,最后一个字符是从0开始顺延的自然数,结果是:0(数字文件夹名称+1)0000,0(数字文件夹名称+1)0001...,
新创建文件夹命名:attack,dead,hit,run,stand,
attack包括0,1,2,3,4下面的a
dead包括0,1,2,3,4下面的d
hit包括0,1,2,3,4下面的h
run包括0,1,2,3,4下面的r
stand包括0,1,2,3,4下面的s

这样应该很清晰了,附带一张源文件夹结构图
感谢各位
作者: qixiaobin0715    时间: 2020-10-14 15:33

本帖最后由 qixiaobin0715 于 2020-10-14 15:34 编辑

描述不清楚:
1.重命名文件名中的"?"会出现两位以上的数字吗(若是,文件名是5个以上的字符)?
2.a,b,h,r,s是最末级文件夹吗?若是末级文件夹,是否还有其它分支路径的末级文件夹存在?
思路可参考http://www.bathome.net/thread-56840-1-1.html
作者: miss_sokuber    时间: 2020-10-14 15:40

回复 2# qixiaobin0715
1.重命名文件名中的"?"会出现两位以上的数字吗(若是,文件名是5个以上的字符)?答:这个?只会是一个数字,就是以数字命名的这个文件夹的名称,比如是文件夹名称是0,则这个?就是1
2.a,b,h,r,s是最末级文件夹吗?若是末级文件夹,是否还有其它分支路径的末级文件夹存在?答:是最末级文件夹,没有其他的文件夹了,里面就是一些后缀为.png的图片了,
作者: qixiaobin0715    时间: 2020-10-14 16:11

回复 3# miss_sokuber
文件夹名是9,10,11...呢?9+1=10
作者: miss_sokuber    时间: 2020-10-14 16:23

回复 4# qixiaobin0715
其实就是数字+1,0变成1.1变成2,这样,
作者: Batcher    时间: 2020-10-15 00:44

回复 1# miss_sokuber


测试代码之前,请备份你的文件夹。

请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /ad') do (
  4.     pushd "%%a"
  5.     set FolderNum=1000
  6.     md a b h r s
  7.     for /f "delims=" %%b in ('dir /b /ad ^| findstr /v /c:"a" /c:"b" /c:"h" /c:"r" /c:"s"') do (
  8.         pushd "%%b"
  9.         set /a FolderNum+=1
  10.         for /f "delims=" %%c in ('dir /b /ad') do (
  11.             set FileNum=1000
  12.             for /f "delims=" %%d in ('dir /b /a-d "%%c\*.png"') do (
  13.                 set /a FileNum+=1
  14.                 set "NewName=!FolderNum:~02!!FileNum:~-3!%%~xd"
  15.                 echo 正在处理文件 %%a\%%b\%%c\%%d
  16.                 ren "%%c\%%d" "!NewName!"
  17.                 move "%%c\!NewName!" "..\%%c"
  18.             )
  19.             rd "%%c"
  20.         )
  21.         popd
  22.         rd "%%b"
  23.     )
  24.     popd
  25. )
复制代码

作者: WHY    时间: 2020-10-15 01:07

本帖最后由 WHY 于 2020-10-15 09:20 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 查找png文件,其上上一级目录名为单个数字
  4. for /f "delims=" %%i in ('dir /b /a-d /s *.png ^| findstr "\\[0-9]\\[^\\]*\\[^\\]*$"') do (
  5.     REM 当前png所在目录
  6.     set "curPath=%%~dpi"
  7.     if /i "!prePath!" NEQ "!curPath!" (
  8.         REM png文件的上上一级目录名
  9.         for %%j in ("%%i\..\..") do set /a n = "(%%~nj + 1) * 1000 + 100001"
  10.         if defined prePath (
  11.             for %%j in ("!prePath!.") do (
  12.                 md "!prePath!..\..\%%~nxj" 2>nul
  13.                 move "!prePath!*.png" "!prePath!..\..\%%~nxj\"
  14.             )
  15.         )
  16.     ) else (
  17.         set /a n+=1
  18.     )
  19.     REM 前一个png所在目录
  20.     set "prePath=%%~dpi"
  21.     ren "%%i" "!n:~1!%%~xi"
  22. )
  23. if defined prePath (
  24.     for %%j in ("!prePath!.") do (
  25.         md "!prePath!..\..\%%~nxj" 2>nul
  26.         move "!prePath!*.png" "!prePath!..\..\%%~nxj\"
  27.     )
  28. )
  29. REM 删除空目录
  30. for /f "delims=" %%i in ('dir /b /ad /s ^| sort /r') do rd "%%i" 2>nul
  31. pause
复制代码

作者: qixiaobin0715    时间: 2020-10-15 09:45

本帖最后由 qixiaobin0715 于 2020-10-15 09:46 编辑

回复 1# miss_sokuber

根据你的要求,这样描述要清楚些:
1001文件夹下,若有数字文件夹0,1,2,3,4共五个,那么子文件夹a有五个,b也有五个...。需将五个a文件夹合并,五个b文件夹合并...,重命名文件,并将文件夹a,b...移到1001文件夹下,最后删除0,1,2,3,4空文件夹。其它依此类推。
作者: Batcher    时间: 2020-10-15 10:19

回复 8# qixiaobin0715


    可能每个人的理解不一样,看完楼主顶楼的描述,我可以写出完整的代码。但是看完你这个描述,感觉还是有很多需求不理解。
作者: miss_sokuber    时间: 2020-10-15 10:56

回复 8# qixiaobin0715
你的描述有点错误,也许是我说的太啰嗦了,哈哈哈,我重组一下我的需求,是这样的:
1001文件夹下,若有数字文件夹0,1,2,3,4共五个,那么每个子文件夹下都有a,d,h,r,s五个文件夹,再往里面就是图片了...。需将a,d,h,r,s五个文件夹下的图片合并...,有几张就合并几张,并重命名文件,并将文件夹a,b...移到1001文件夹下,最后删除0,1,2,3,4空文件夹。其它依此类推。
作者: miss_sokuber    时间: 2020-10-15 10:57

1001文件夹下,若有数字文件夹0,1,2,3,4共五个,那么每个子文件夹下都有a,d,h,r,s五个文件夹,再往里面就是图片了...。需将a,d,h,r,s五个文件夹下的图片合并...,有几张就合并几张,并重命名文件,并将文件夹a,b...移到1001文件夹下,最后删除0,1,2,3,4空文件夹。其它依此类推。
图片命名规则:第一个字符是0,第二个字符是0,1,2,3,4这五个文件夹的名称+1,然后接3个0,最后一个字符是从1顺延的自然数,结果是:0(数字文件夹名称+1)0001,0(数字文件夹名称+1)0002...有几张图片尾数就是几,
文件夹命名:a->attack,d->dead,h->hit,r->run,s->stand,
附带一张结构图
作者: miss_sokuber    时间: 2020-10-15 10:59

回复 9# Batcher
基本实现了,复制图片那里错了,正确的是a,d,h,r,s五个文件夹下的图片合并...,有几张就合并几张,
作者: miss_sokuber    时间: 2020-10-15 11:00

回复 7# WHY
感谢感谢,基本实现了,复制图片那里错了,正确的是a,d,h,r,s五个文件夹下的图片合并...,有几张就合并几张,
作者: qixiaobin0715    时间: 2020-10-15 11:12

可能我理解的有问题:
作者: miss_sokuber    时间: 2020-10-15 11:37

回复 14# qixiaobin0715
0下面的就合并到attack,1下面的就合并到dead,下面的就合并到hit,下面的就合并到run,下面的就合并到stand
作者: qixiaobin0715    时间: 2020-10-15 12:06

你想表达的意思是:将最末级文件夹中的文件改名并上移一级,删除移空的文件夹。文件夹改名有意义吗?
作者: miss_sokuber    时间: 2020-10-15 12:16

回复 16# qixiaobin0715
你说的对,改名无任务意义,只需要重新创建新文件夹就好了,原谅我之前的胡乱描述
作者: qixiaobin0715    时间: 2020-10-15 12:34

回复 15# miss_sokuber

我上面的意思是,不如0下的合并到0,1下的合并到1...。省得再创建新的文件夹了。
作者: WHY    时间: 2020-10-15 14:10

本帖最后由 WHY 于 2020-10-15 14:22 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a x=0
  4. for %%i in (attack dead hit run stand) do set  "_!x!=%%i" & set /a x+=1
  5. REM 查找png文件,其上一级目录名为a、d、h、r、s,上上一级目录名为数字0-4
  6. for /f "delims=" %%i in ('dir /b /a-d /s *.png ^| findstr /i "\\[0-4]\\[adhrs]\\[^\\]*$"') do (
  7.     REM 当前png文件的上上一级目录
  8.     for %%j in ("%%i\..\..") do set "curPath=%%~fj"
  9.     if /i "!prePath!" NEQ "!curPath!" (
  10.         for %%j in ("%%i\..\..") do (
  11.             set /a n = "(%%~nj + 1) * 1000 + 1"
  12.             set "newFolder=!_%%~nj!"
  13.             md "%%i\..\..\..\!newFolder!" 2>nul
  14.         )
  15.     ) else (
  16.         set /a n+=1
  17.     )
  18.     REM 前一个png文件的上上一级目录
  19.     set "prePath=!curPath!"
  20.     move "%%i" "%%i\..\..\..\!newFolder!\0!n!%%~xi"
  21. )
  22. REM 删除空目录
  23. for /f "delims=" %%i in ('dir /b /ad /s ^| sort /r') do rd "%%i" 2>nul
  24. pause
复制代码

作者: WHY    时间: 2020-10-15 14:27

描述得模模糊糊,看了好几遍才搞明白。
作者: miss_sokuber    时间: 2020-10-15 14:47

回复 19# WHY
实现效果基本已经达到了,就是命名没正确,能否看一下我最初发需求那里,我重新整理了,😁😁
作者: WHY    时间: 2020-10-15 15:03

回复 21# miss_sokuber


    哪一条命令没正确?
脚本保存为 test.bat,编码格式选 ansi,test.bat 与 1001、1002 文件夹存放在同一级目录里面。
我测试没有问题。
作者: miss_sokuber    时间: 2020-10-15 15:12

回复 22# WHY
命令没问题,是图片命名搞错了,正确的是
attack包括0下面的a,d,h,r,s下的所有图片,最终生成的是010000,0100001,0100002...,020000,020001...,030000,040000,040001,040002,050001,050001,尾数是按0开始,后续的类推
dead包括1下面的a,d,h,r,s下的所有图片,最终生成的是010000,0100001,0100002...,020000,020001...,030000,040000,040001,040002,050001,050001,尾数是按0开始,后续的类推
hit包括2下面的a,d,h,r,s下的所有图片,最终生成的是010000,0100001,0100002...,020000,020001...,030000,040000,040001,040002,050001,050001,尾数是按0开始,后续的类推
run包括3下面的a,d,h,r,s下的所有图片,最终生成的是010000,0100001,0100002...,020000,020001...,030000,040000,040001,040002,050001,050001,尾数是按0开始,后续的类推
stand包括4下面的a,d,h,r,s下的所有图片,最终生成的是010000,0100001,0100002...,020000,020001...,030000,040000,040001,040002,050001,050001,尾数是按0开始,后续的类推
作者: qixiaobin0715    时间: 2020-10-15 15:26

本帖最后由 qixiaobin0715 于 2020-10-15 16:22 编辑

你还是没说清楚:0文件夹下的文件名第二个数字应当是0+1=1,你怎么搞出来12345都有啊。
什么情况下0+1、什么情况下1+1、什么情况下2+1...?应当说清楚。
作者: miss_sokuber    时间: 2020-10-15 16:33

回复 24# qixiaobin0715
按文件夹a,d,h,r,s的顺序,也可以说是a下面的就是对应0+1,d下面的就是对应1+1,这样类推
你看我最最顶楼重新整理的,跟我回复给上一楼的表述,应该说清楚了吧😂😂
作者: qixiaobin0715    时间: 2020-10-15 16:43

这么说不就清楚了吗!跟文件夹数字无关。与文件夹a,d,h,r,s有联系。a-1 d-2 h-3 r-4 s-5
作者: miss_sokuber    时间: 2020-10-15 16:47

回复 26# qixiaobin0715
是的,是的,我都有点想打我自己了,哈哈哈
作者: qixiaobin0715    时间: 2020-10-15 17:10

这样代码也好写多了。
作者: miss_sokuber    时间: 2020-10-15 18:12

回复 28# qixiaobin0715

有结果了吗,兄弟
作者: WHY    时间: 2020-10-15 19:57

回复 23# miss_sokuber


    这样试试,如果仍然不行,我放弃。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a x=0
  4. for %%i in (attack dead hit run stand) do (
  5.     set "s=%%i" & set "s=!s:~0,1!"
  6.     set "_!x!=%%i"
  7.     set /a x+=1, #!s!=x
  8. )
  9. REM 查找png文件,其上一级目录名为a、d、h、r、s,上上一级目录名为数字0-4
  10. for /f "delims=" %%i in ('dir /b /a-d /s *.png ^| findstr /i "\\[0-4]\\[adhrs]\\[^\\]*$"') do (
  11.     REM 当前png文件所在的目录
  12.     set "curPath=%%~dpi"
  13.     if /i "!prePath!" NEQ "!curPath!" (
  14.         for %%j in ("%%i\..") do set /a n = !#%%~nj! * 1000
  15.         REM png文件的上上一级目录
  16.         for %%j in ("%%i\..\..") do (
  17.             set "newFolder=!_%%~nj!"
  18.             md "%%i\..\..\..\!newFolder!" 2>nul
  19.         )
  20.     ) else (
  21.         set /a n+=1
  22.     )
  23.     REM 前一个png文件所在的目录
  24.     set "prePath=%%~dpi"
  25.     move "%%i" "%%i\..\..\..\!newFolder!\0!n!%%~xi"
  26. )
  27. REM 删除空目录
  28. for /f "delims=" %%i in ('dir /b /ad /s ^| sort /r') do rd "%%i" 2>nul
  29. pause
复制代码

作者: miss_sokuber    时间: 2020-10-15 20:14

回复 30# WHY

已经行了,非常棒。感谢感谢!!但是我想把所有01234文件夹下面的a文件夹下面的图片放入attack,d文件夹下面的图片放入dead....其他的也是以这种方式类推。。我该改哪里,
作者: WHY    时间: 2020-10-16 10:07

回复 31# miss_sokuber


    图片命名规则:第一个字符是0,第二个字符是0,1,2,3,4这五个文件夹其中一个的名称+1,然后接3个0,最后一个字符是从0开始顺延的自然数,结果是:0(数字文件夹名称+1)0000,0(数字文件夹名称+1)0001...,
新创建文件夹命名:attack,dead,hit,run,stand,
attack包括0,1,2,3,4下面的a
dead包括0,1,2,3,4下面的d
hit包括0,1,2,3,4下面的h
run包括0,1,2,3,4下面的r
stand包括0,1,2,3,4下面的s
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (attack dead hit run stand) do (
  4.     set "s=%%i" & set "s=!s:~0,1!"
  5.     set "_!s!=%%i"
  6. )
  7. REM 查找png文件,其上一级目录名为a、d、h、r、s,上上一级目录名为数字0-4
  8. for /f "delims=" %%i in ('dir /b /a-d /s *.png ^| findstr /i "\\[0-4]\\[adhrs]\\[^\\]*$"') do (
  9.     REM 当前png文件所在的目录
  10.     set "curPath=%%~dpi"
  11.     if /i "!prePath!" NEQ "!curPath!" (
  12.         REM png文件的上上一级目录
  13.         for %%j in ("%%i\..\..") do set /a n = "(%%~nj + 1) * 10000"
  14.         for %%j in ("%%i\..") do (
  15.             set "newFolder=!_%%~nj!"
  16.             md "%%i\..\..\..\!newFolder!" 2>nul
  17.         )
  18.     ) else (
  19.         set /a n+=1
  20.     )
  21.     REM 前一个png文件所在的目录
  22.     set "prePath=%%~dpi"
  23.     move "%%i" "%%i\..\..\..\!newFolder!\0!n!%%~xi"
  24. )
  25. REM 删除空目录
  26. for /f "delims=" %%i in ('dir /b /ad /s ^| sort /r') do rd "%%i" 2>nul
  27. pause
复制代码





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