Board logo

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

作者: 997666    时间: 2017-3-29 16:21     标题: [已解决]批处理怎样把多个文件夹移动到以名称开头前几个字符串命名的文件夹?

本帖最后由 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个前缀字符的文件夹。

因为是文件夹的归置,请问可以实现吗?不甚感谢!
作者: ShowCode    时间: 2017-3-29 16:48

执行代码之前请注意做好备份
  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. )
复制代码

作者: 997666    时间: 2017-3-29 16:58

本帖最后由 997666 于 2017-3-29 17:32 编辑

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

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

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

谢谢!
作者: ShowCode    时间: 2017-3-29 17:33

1. 应将“D:\”删掉
作者: 997666    时间: 2017-3-29 17:43

回复 4# ShowCode

谢谢,已成功,请教下第二点(目标文件夹命名规则为“20-0001#”,“21-0002#”,“22-0003#”的文件夹)应该如何更改。
作者: ShowCode    时间: 2017-3-29 21:30

回复 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. )
复制代码

作者: Nsqs    时间: 2017-3-29 22:59

本帖最后由 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}}
复制代码

作者: 997666    时间: 2017-3-30 09:18

本帖最后由 997666 于 2017-3-30 10:01 编辑

回复 6# ShowCode


已成功,感谢!

另外还想请教一下,如果是需要移动的文件夹变为文件,且目标字符在后面(如“0001#”变为“20_0001#.exe”),需要如何更改?
作者: 997666    时间: 2017-3-30 10:03

回复 7# Nsqs


    谢谢帮助!
作者: ShowCode    时间: 2017-3-30 18:15

回复 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!\"
    )
)
作者: Nsqs    时间: 2017-3-30 19:10

本帖最后由 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嵌套层循环将大大提高程序执行效率
作者: ShowCode    时间: 2017-3-30 19:23

回复 11# Nsqs


    同意。不过楼主的需求一直在变,目标文件夹的规律也在变,等楼主测试一下你的代码吧。
作者: 997666    时间: 2017-3-31 10:11

回复 10# ShowCode


    感谢帮助,我这边执行该代码后,目标文件均已经移动了,非常感谢你,写的代码错落有致,让人一目了然,而且将特别的地方标红,让我学会举一反三。
作者: 997666    时间: 2017-3-31 10:11

回复 11# Nsqs


    感谢你无私的共享精神!
作者: 172043209    时间: 2017-5-25 14:07

楼上的朋友们好,我看了你们的需求与我的很接近,我想将如下的文件夹
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中, 如何批量处理这样大量的文件夹??

请楼上的高手帮忙解决一下




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