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

[文件操作] [已解决]批处理怎样把多个文件夹移动到以名称开头前几个字符串命名的文件夹?

[复制链接]
发表于 2017-3-29 16:21:09 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2017-5-29 23:28 编辑

【求助】文件夹移动至相同字符文件夹下
请教各位大神;

我在D盘根目录下有“0001#”、“0002#”、“0003#”、“0002_2016~2017”、"0001_2013~2015"等众多文件夹。

我希望将“0002_2016~2017”、"0001_2013~2015"这些文件夹,自动归置至“0001#”、“0002#”等文件夹下。

文件夹的名称均是4位数字有规律的命名,想把长文件名的文件夹,自动移动至相同4个前缀字符的文件夹。

因为是文件夹的归置,请问可以实现吗?不甚感谢!

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2017-3-29 16:48:31 | 显示全部楼层
执行代码之前请注意做好备份
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in ('dir /b /ad "D:" ^| findstr "...._....~...."') do (
  4.     set "str=%%i"
  5.     if exist "!str:~0,4!#" (
  6.         move /y "%%i" "!str:~0,4!#"
  7.     )
  8. )
复制代码
 楼主| 发表于 2017-3-29 16:58:29 | 显示全部楼层
本帖最后由 997666 于 2017-3-29 17:32 编辑

已成功,感谢“ShowCode”朋友,另外想问请教两点:

一、如改成当前bat文件所在文件夹路径,应将“D:\”改为什么?

二、如需要移动的目标文件夹,名称有前缀两位数字及字符,如“20-0001#”,从第三位字符开始是4位有规律的数字,又应该如何更改代码?

谢谢!
发表于 2017-3-29 17:33:24 | 显示全部楼层
1. 应将“D:\”删掉
 楼主| 发表于 2017-3-29 17:43:09 | 显示全部楼层
回复 4# ShowCode

谢谢,已成功,请教下第二点(目标文件夹命名规则为“20-0001#”,“21-0002#”,“22-0003#”的文件夹)应该如何更改。
发表于 2017-3-29 21:30:27 | 显示全部楼层
回复 5# 997666
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in ('dir /b /ad ^| findstr "...._....~...."') do (
  4.     set "str=%%i"
  5.     for /f %%a in ('dir /b /ad ^| findstr "^..-!str:~0,4!#$"') do (
  6.         set "folder=%%a"
  7.     )
  8.     if exist "!folder!" (
  9.         move "%%i" "!folder!"
  10.     )
  11. )
复制代码
发表于 2017-3-29 22:59:40 | 显示全部楼层
本帖最后由 Nsqs 于 2017-3-29 23:04 编辑
  1. @powershell -c foreach($i in (Get-ChildItem -Directory -Filter '*_*')){[string]$d=[System.Collections.Generic.HashSet[string]]$i.FullName -replace '(?!.+_).+','#';if ((Test-Path $d) -and !(Test-Path ($d+'\'+$i.Name))){Move-Item $i.FullName $d}}
复制代码
 楼主| 发表于 2017-3-30 09:18:17 | 显示全部楼层
本帖最后由 997666 于 2017-3-30 10:01 编辑

回复 6# ShowCode


已成功,感谢!

另外还想请教一下,如果是需要移动的文件夹变为文件,且目标字符在后面(如“0001#”变为“20_0001#.exe”),需要如何更改?
 楼主| 发表于 2017-3-30 10:03:21 | 显示全部楼层
回复 7# Nsqs


    谢谢帮助!
发表于 2017-3-30 18:15:29 | 显示全部楼层
回复 8# 997666


@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir /b /a-d ^| findstr "...._....~...."') do (
    set "str=%%i"
    for /f %%a in ('dir /b /ad ^| findstr "^.._!str:~0,4!#.exe$"') do (
        set "folder=%%a"
    )
    if exist "!folder!\" (
        move "%%i" "!folder!\"
    )
)

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2017-3-30 19:10:16 | 显示全部楼层
本帖最后由 Nsqs 于 2017-3-30 19:11 编辑

回复 10# ShowCode
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-2 delims=_" %%1 in ('dir /ad/b "*#" "*_*"')do (set d=%%1
  3.         if not "!d:~,-1!#"=="%%1%%2" (
  4.                 move /y "%%~dp1%%1_%%2" "%%~dp1%%1#\%%1_%%2"
  5.         )
  6. )
复制代码
尽量少在for ('')中过多使用外部程序以及过多for嵌套层循环将大大提高程序执行效率

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2017-3-30 19:23:08 | 显示全部楼层
回复 11# Nsqs


    同意。不过楼主的需求一直在变,目标文件夹的规律也在变,等楼主测试一下你的代码吧。
 楼主| 发表于 2017-3-31 10:11:21 | 显示全部楼层
回复 10# ShowCode


    感谢帮助,我这边执行该代码后,目标文件均已经移动了,非常感谢你,写的代码错落有致,让人一目了然,而且将特别的地方标红,让我学会举一反三。
 楼主| 发表于 2017-3-31 10:11:59 | 显示全部楼层
回复 11# Nsqs


    感谢你无私的共享精神!
发表于 2017-5-25 14:07:56 | 显示全部楼层
楼上的朋友们好,我看了你们的需求与我的很接近,我想将如下的文件夹
1978-JX13-1.0001,1978-JX13-1.0002,1978-JX13-1.0003,1978-JX13-1.0004,1992-JX13-11.0001,1992-JX13-11.0002,1992-JX13-11.0003,1992-JX13-11.0004以前面的部分字符串如1978-JX13-1、1992-JX13-11为名建立文件夹,并将文件夹1978-JX13-1.0001,1978-JX13-1.0002,1978-JX13-1.0003,1978-JX13-1.0004等连同里面的文件移动到对应的文件夹1978-JX13-1、1992-JX13-11中, 如何批量处理这样大量的文件夹??

请楼上的高手帮忙解决一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 02:28 , Processed in 0.023838 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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