找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30182|回复: 4

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

[复制链接]
发表于 2017-1-22 15:21:49 | 显示全部楼层 |阅读模式
有许多文件,名称有字母数字构成,其中有一部分文件名前几位是相同的,只有最后一位或两位是数字(1,2,3,……9,10,11这样的)不同,把前面部分相同的文件移动到一个文件夹中,文件夹命名规则是【文件个数+相同部分】。比如
gjs5db1
gjs5db2
gjs5db3
移动到文件夹【3-gjs5db】中
发表于 2017-2-10 14:48:48 | 显示全部楼层
菜鸟做题,谢谢
不知道怎么提取相同文件名部分,所以需要手动指定
  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
复制代码
发表于 2017-2-10 21:48:23 | 显示全部楼层
纯批其实不好玩
  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技术 +1 收起 理由
taofan712 + 1 感谢分享

查看全部评分

发表于 2017-2-11 11:35:06 | 显示全部楼层
好久不玩了
这样行不
  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
复制代码
发表于 2020-5-16 18:19:30 | 显示全部楼层
回复 3# 回家路上


    显示效果蛮牛,可没起效果,大神,就是没有创建文件夹,有没有其它大神知道怎么回事吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 18:15 , Processed in 0.017971 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表