Board logo

标题: [文件操作] 求助批处理,关于子文件夹批量命名的问题 [打印本页]

作者: myh17909    时间: 2022-5-8 20:24     标题: 求助批处理,关于子文件夹批量命名的问题



求助如图,需要将根目录下001文件夹中的各子文件夹批量重命名“语文-001”,“语文-002”,。。。直到全部命名完成。
同理,002,003,004文件夹也是一样。这个如何操作,恳请论坛上各位大神回复!好人一生平安,拜谢!


图片上传了好久一直传不进去,不知道什么原因。002的子文件夹需要修改为数学-001,数学-002,数学-003等等

003的是英语

004的是科学

麻烦哪位大神帮忙解决一下


图片链接https://imgtu.com/i/O3yVUg
作者: Batcher    时间: 2022-5-8 20:45

回复 1# myh17909


如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: myh17909    时间: 2022-5-8 20:52

回复 2# Batcher


    谢谢版主大佬
作者: Batcher    时间: 2022-5-8 20:57

回复 1# myh17909


请注意先做好原始文件夹或文件备份,再开始测试代码。

请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. cd "001"
  5. set "n=1000"
  6. for /f "delims=" %%i in ('dir /b /ad') do (
  7.     set /a n+=1
  8.     ren "%%i" "语文-!n:~1!"
  9. )
  10. cd "..\002"
  11. set "n=1000"
  12. for /f "delims=" %%i in ('dir /b /ad') do (
  13.     set /a n+=1
  14.     ren "%%i" "数学-!n:~1!"
  15. )
  16. cd "..\003"
  17. set "n=1000"
  18. for /f "delims=" %%i in ('dir /b /ad') do (
  19.     set /a n+=1
  20.     ren "%%i" "英语-!n:~1!"
  21. )
  22. cd "..\004"
  23. set "n=1000"
  24. for /f "delims=" %%i in ('dir /b /ad') do (
  25.     set /a n+=1
  26.     ren "%%i" "科学-!n:~1!"
  27. )
复制代码

作者: myh17909    时间: 2022-5-8 21:35

回复 4# Batcher


    谢谢版主大人,好人一生平安!
作者: qixiaobin0715    时间: 2022-5-9 10:17

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set var=语文 001 数学 002 英语 003 科学 004
  4. for %%i in (%var%) do (
  5.     set /a n+=1
  6.     set /a m=n%%2
  7.     if !m! equ 0 set _%%i=!var1!
  8.     set var1=%%i
  9. )
  10. for /d %%a in (00?) do (
  11.     if defined _%%a (
  12.         pushd %%a
  13.         set n=1000
  14.         for /f "delims=" %%b in ('dir /b /ad') do (
  15.             set /a n+=1
  16.             ren "%%b" "!_%%a!-!n:~1!"
  17.         )
  18.         popd
  19.     )
  20. )
  21. pause
复制代码

作者: myh17909    时间: 2022-5-10 11:54

回复 6# qixiaobin0715


    谢谢大佬,好人一生平安!
作者: myh17909    时间: 2022-5-10 11:57

回复 4# Batcher


    麻烦问一下版主大佬,这里的格式“语文-001”,“语文-002”要是做成“语文 (1)”,“语文 (2)”这样的格式应该怎么改,麻烦您指导一下
作者: flashercs    时间: 2022-5-10 18:09

本帖最后由 flashercs 于 2022-5-11 11:51 编辑

回复 8# myh17909
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. cd /d "%~dp0"
  4. set 001=语文
  5. set 002=数学
  6. set 003=英语
  7. set 004=科学
  8. for /d %%A in (*) do (
  9.   if defined %%~nxA call :renexcept "%%~fA" "!%%~nxA!"
  10. )
  11. endlocal
  12. pause
  13. exit /b
  14. :renexcept
  15. setlocal enabledelayedexpansion
  16. pushd "%~1"|| goto :end
  17. set oldnames="%temp%\~%random%"
  18. set newnames="%temp%\~%random%"
  19. set oldexcept="%temp%\~%random%"
  20. set newexcept="%temp%\~%random%"
  21. set n=0
  22. >%oldnames% (
  23.   for /f "delims=" %%A in ('dir /ad /b') do (
  24.     echo %%~nxA
  25.     set /a n+=1
  26.     set "newlist[!n!]=%~2 (!n!)"
  27.   )
  28. )
  29. >%newnames% (for /f "tokens=1* delims==" %%A in ('set newlist[') do echo %%B)
  30. >%oldexcept% findstr /ilxvg:%newnames% %oldnames%
  31. >%newexcept% findstr /ilxvg:%oldnames% %newnames%
  32. @REM findstr is BUGey
  33. <%newexcept% (
  34.   for /f "usebackq delims=" %%A in (%oldexcept%) do (
  35.     set /p newname=
  36.     if defined newname (
  37.       echo ren "%%A" "!newname!"
  38.       ren "%%A" "!newname!"
  39.     )
  40.   )
  41. )
  42. del %oldnames% %newnames% %oldexcept% %newexcept%
  43. popd
  44. :end
  45. endlocal
  46. exit /b
复制代码

作者: myh17909    时间: 2022-5-11 11:49

回复 4# Batcher


    麻烦问一下版主大佬,这里的格式“语文-001”,“语文-002”要是做成“语文 (1)”,“语文 (2)”这样的格式应该怎么改,麻烦您指导一下
作者: flashercs    时间: 2022-5-11 11:52

回复 10# myh17909


    楼上代码已修改, 是有问题吗?
作者: myh17909    时间: 2022-5-11 11:57

回复 11# flashercs


    谢谢大神,好人一生平安!
作者: myh17909    时间: 2022-5-11 19:45

本帖最后由 myh17909 于 2022-5-11 19:50 编辑

回复 11# flashercs


    您好大神,按照您的代码运行了一下,现在的问题是重命名不是按顺序依次来的,有点乱序,如何解决?
图片链接:https://imgtu.com/i/OdYZm6
作者: flashercs    时间: 2022-5-11 21:33

回复 13# myh17909


    按资源管理器排序是个问题,与批处理排序规则不同,很麻烦的... 尤其是你这种要求,按序号排序.
  1. <#*,:&cls
  2. @echo off
  3. REM 这里是指目录下所有文件全部重命名.新文件名与旧文件名是一一对应的,顺序不能改变.
  4. REM 旧文件名集合是按照for列出的顺序.新文件名集合是自定义数组.
  5. REM 此法重命名次数最多
  6. setlocal enabledelayedexpansion
  7. cd /d "%~dp0"
  8. set 001=语文
  9. set 002=数学
  10. set 003=英语
  11. set 004=科学
  12. for /d %%A in (*) do (
  13.   if defined %%~nxA call :rentemp "%%~fA" "!%%~nxA!"
  14. )
  15. endlocal
  16. pause
  17. exit /b
  18. :rentemp
  19. setlocal enabledelayedexpansion
  20. pushd "%~1"|| goto end
  21. set n=0
  22. @REM 按Explorer排序规则排序
  23. for /f "delims=" %%A in ('dir /ad /b^|powershell -c "Set-Location -LiteralPath ([Environment]::CurrentDirectory);. ([ScriptBlock]::Create((Get-Content -LiteralPath \"%~f0\" -ReadCount 0 | Out-String))) $input"') do (
  24.   REM 必须一一对应,如果新文件名已存在,则必须重命名为临时文件名,并保存到临时列表,数据格式:oldname/tempname/targetname
  25.   set /a n+=1
  26.   set "newname=%~2 (!n!)"
  27.   if not "!newname!"=="%%A" (
  28.     if exist "!newname!" (
  29.       call :getTempName
  30.       @REM echo ren "%%A" "!tempname!"
  31.      >nul 2>nul ren "%%A" "!tempname!" && set "templist[!n!]=%%A/!tempname!/!newname!"
  32.     ) else (
  33.       echo ren "%%A" "!newname!"
  34.       ren "%%A" "!newname!"
  35.     )
  36.   )
  37. )
  38. REM 重命名临时列表
  39. for /f "tokens=1* delims==" %%A in ('2^>nul set templist[') do (
  40.   for /f "tokens=1-3 delims=/" %%C in ("%%B") do (
  41.     echo ren "%%C" "%%E"
  42.     ren "%%D" "%%E"
  43.   )
  44. )
  45. popd
  46. :end
  47. endlocal
  48. exit /b
  49. :getTempName
  50. :loop
  51. set tempname=~%random%~
  52. if exist "%tempname%" goto loop
  53. @REM echo tempname=%tempname%
  54. exit /b
  55. #>
  56. param([psobject]$InputObject)
  57. Add-Type -TypeDefinition @'
  58. using System;
  59. using System.Collections.Generic;
  60. using System.Runtime.InteropServices;
  61. namespace MyCode
  62. {
  63.   public class ExplorerViewComparer : Comparer<string>
  64.   {
  65.     [DllImport("Shlwapi.dll", EntryPoint = "StrCmpLogical", CharSet = CharSet.Auto)]
  66.     internal static extern int StrCmpLogical(string p1, string p2);
  67.    
  68.     public override int Compare(string x, string y)
  69.     {
  70.       return StrCmpLogical(x, y);
  71.     }
  72.   }
  73. }
  74. '@
  75. # create comparer object
  76. $ExpComp = New-Object MyCode.ExplorerViewComparer
  77. $arrstr = [string[]]@($InputObject)
  78. [Array]::Sort($arrstr, $ExpComp)
  79. $arrstr
  80. trap {continue}
复制代码

作者: Batcher    时间: 2022-5-11 23:28

回复 8# myh17909


请注意先做好原始文件夹或文件备份,再开始测试代码。

请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. cd "001"
  5. set "n=0"
  6. for /f "delims=" %%i in ('dir /b /ad') do (
  7.     set /a n+=1
  8.     ren "%%i" "语文 (!n!)"
  9. )
  10. cd "..\002"
  11. set "n=0"
  12. for /f "delims=" %%i in ('dir /b /ad') do (
  13.     set /a n+=1
  14.     ren "%%i" "数学 (!n!)"
  15. )
  16. cd "..\003"
  17. set "n=0"
  18. for /f "delims=" %%i in ('dir /b /ad') do (
  19.     set /a n+=1
  20.     ren "%%i" "英语 (!n!)"
  21. )
  22. cd "..\004"
  23. set "n=0"
  24. for /f "delims=" %%i in ('dir /b /ad') do (
  25.     set /a n+=1
  26.     ren "%%i" "科学 (!n!)"
  27. )
复制代码

作者: myh17909    时间: 2022-5-12 21:00

回复 15# Batcher


    版主大神威武!!感激不尽!
作者: myh17909    时间: 2022-5-12 21:01

回复 14# flashercs


    感谢大神辛苦付出,但是代码还是不太好用,版主已经给出了解决方案,谢谢了!




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