[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 批处理怎样把文件名相同的文件移动到一个文件夹中?

有许多文件,名称有字母数字构成,其中有一部分文件名前几位是相同的,只有最后一位或两位是数字(1,2,3,……9,10,11这样的)不同,把前面部分相同的文件移动到一个文件夹中,文件夹命名规则是【文件个数+相同部分】。比如
gjs5db1
gjs5db2
gjs5db3
移动到文件夹【3-gjs5db】中

回复 3# 回家路上


    显示效果蛮牛,可没起效果,大神,就是没有创建文件夹,有没有其它大神知道怎么回事吗?

TOP

好久不玩了
这样行不
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d /b') do (
  3.     if not "%~nx0" == "%%i" (
  4.        set n=0&set "name=%%~ni"
  5.        set "str=!name!"
  6.        for /l %%j in (0,1,2) do if !str:~-1! leq 9 set str=!str:~,-1!
  7.        if exist "!str!*%%~xi" for /f "delims=" %%j in ('dir /a-d /b "!str!*%%~xi" 2^>nul') do (
  8.             set "str1=%%~nj"
  9.             for /l %%k in (0,1,2) do if !str1:~-1! leq 9 set str1=!str1:~,-1!
  10.             if "!str1!" == "!str!" (
  11.                set /an+=1
  12.                set "name!n!=%%~fj"
  13.             )
  14.         )
  15.         for /l %%j in (1,1,!n!) do (
  16.            md "!n!_!str!" 2>nul
  17.            move "!name%%j!" "!n!_!str!" 2>nul
  18.         )
  19.     )
  20. )
  21. pause
复制代码

TOP

纯批其实不好玩
  1. @echo off & setlocal enabledelayedexpansion
  2. :: 功能:
  3. ::    文件名前面相同多个的创建文件装起来
  4. ::    无相同得单独一个文件不管
  5. for /f "delims=" %%i in ('dir /a-d /b') do (
  6. set "name=%%~ni" & set "n=" & set "_n=" & set "pre="
  7. for %%j in (0,1,2,3,4,5,6,7,8,9) do (
  8. set name=!name:%%j=!
  9. set suf=!name:~-1!
  10. )
  11. set "name=%%~ni"
  12. rem 不想用goto,就假设名字中没有20个相同的字符
  13. for /l %%j in (1,1,20) do (
  14. if not defined n (
  15. for %%k in (!suf!) do set name=!name:*%%k=!
  16. set /a "tmp=name"
  17. if "!name!"=="!tmp!" set n=!name!
  18. )
  19. )
  20. set "name=%%~ni" & set "tmp="
  21. if defined n (
  22. for %%j in (!n!) do set pname="!name:%%j=" "!"
  23. for %%j in (!pname!) do (
  24. if defined pre (
  25. if "%%~j"=="" (
  26. set tmp=!n!
  27. ) else (
  28. if defined tmp (
  29. set "pre=!pre!!tmp!" & set "tmp="
  30. )
  31. set pre=!pre!!n!%%~j
  32. )
  33. ) else set pre=%%~j
  34. )
  35. rem 文件名有空格时影响set /a,先替换一下,完事换回来
  36. set pre=!pre: ={_}!
  37. set /a "#fnum[!pre!]+=1,_n=#fnum[!pre!]"
  38. set pre=!pre:{_}= !
  39. if !_n! gtr 1 (
  40. for /f "delims=" %%j in ("!pre!") do (
  41. if not "!%%j!"=="" (
  42. echo;文件夹:[!pre!]
  43. echo;    1. !%%j!
  44. rem echo;拷贝!%%j! --^> 文件夹%%j
  45. set "!pre!="
  46. )
  47. )
  48. echo;    !_n!. %%~nxi
  49. rem echo;拷贝!name! --^> 文件夹!pre!
  50. ) else set !pre!=%%~nxi
  51. )
  52. )
  53. echo;--------------------------------------
  54. echo;打印一下数量,{_}代表空格
  55. set #fnum
  56. pause & exit /b
复制代码
1

评分人数

人生是一部书/只有这一页最温暖/读懂它的时候/我们在远方流泪...

TOP

菜鸟做题,谢谢
不知道怎么提取相同文件名部分,所以需要手动指定
  1. @echo on
  2. setlocal enabledelayedexpansion
  3. set /p alike=请输入相同文件名部分,如有多个,用空格隔开:
  4. for %%a in (%alike%) do (
  5. md _%%a 2>nul
  6. set n=
  7. for /f "delims=" %%b in ('dir /a-d /s /b "%cd%\%%a??.*" 2^>nul') do (
  8. set /a n+=1
  9. move /y "%%b" _%%a
  10. )
  11. ren _%%a !n!_%%a
  12. )
  13. pause>nul
复制代码

TOP

返回列表