Board logo

标题: [文件操作] [已解决]批处理怎样将多个文件移动到以文件名中指定字符串前缀命名文件夹里? [打印本页]

作者: 997666    时间: 2017-3-30 15:52     标题: [已解决]批处理怎样将多个文件移动到以文件名中指定字符串前缀命名文件夹里?

本帖最后由 pcl_test 于 2018-4-11 21:55 编辑

将当前目录下规则命名的文件归置至相同字符文件夹下
我在当前目录下有大量的“AB0001#-5_调研报告.pdf”“AB0003#-5_对象研究报告.pdf”“AB0005#-5_竞争力报告.pdf”的文件(第3位字符~第6位字符为对象字符),希望可以归置至“01-0001#”“02-0002#”“03-0005#”文件夹下(第4位字符~第7位字符为对应规则)。

请教各位!


追问:如果变为“0001AB浇水量研究.pdf”“0003CD花卉供应商名单.pdf”“0005AA除虫记录.pdf”的文件(前4位字符为对象字符),希望可以归置至“0001乔木资料”“0002松树文件”“0005樟树除虫记录”文件夹下(前4位字符为对应规则)。请问代码应如何更改?
作者: 997666    时间: 2017-3-30 17:48

本帖最后由 997666 于 2017-3-30 17:54 编辑

我参考了很多论坛同类帖子,大多数是以文件名前几位字符来新建文件夹,我这种情况跟之前网友不同之处有三点:

一、并非新建文件夹,而是移动至指定文件夹。

二、移动文件及对象文件夹的规则字符均不是前4位,而是中间的几位字符。

三、移动文件的名称字符长度不一。
作者: ShowCode    时间: 2017-3-30 18:34

@echo off
setlocal enabledelayedexpansion
for /f %%i in ('dir /b /a-d') do (
    set "str=%%i"
    for /f %%a in ('dir /b /ad ^| findstr "^..-!str:~2,4!#$"') do (
        set "folder=%%a"
    )
    if exist "!folder!\" (
        move "%%i" "!folder!\"
    )
)
作者: 997666    时间: 2017-3-31 09:35

本帖最后由 pcl_test 于 2017-3-31 14:34 编辑

回复 3# ShowCode


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

但还是想请教一下;

第5行
    for /f %%a in ('dir /b /ad ^| findstr "^..-!str:~2,4!#$"') do (
语句中的  findstr "^..-!str:~2,4!#$" 应该是寻找移动至目标文件夹,findstr对应字符意义如下;

.        通配符: 任何字符
*        重复: 以前字符或类出现零或零以上次数
^        行位置: 行的开始
$        行位置: 行的终点

我尝试改为将“AB0001#-5_调研报告.pdf”“AB0003#-5_对象研究报告.pdf”“AB0005#-5_竞争力报告.pdf”   对应   "A0001#""B0003#""C0005"  文件夹,
    for /f %%a in ('dir /b /ad ^| findstr "^.!str:~2,4!#$"') do (

这样实验成功,但是我想改为改为将“AB0001#-5_调研报告.pdf”“AB0003#-5_对象研究报告.pdf”“AB0005#-5_竞争力报告.pdf”   对应   "0001#""0003#""0005"  文件夹,
    for /f %%a in ('dir /b /ad ^| findstr "^!str:~2,4!#$"') do (

该批处理却不成功,文件被移动至根目录,我理解通配符删除了,那就应该从第一个字符开始对应了,为什么不行,请教一下,如何更改?

.
作者: ShowCode    时间: 2017-3-31 14:05

回复 4# 997666
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in ('dir /b /a-d *.pdf') do (
  4.     set "str=%%i"
  5.     for /f %%a in ('dir /b /ad ^| findstr /b /e "!str:~2,4!#"') do (
  6.         set "folder=%%a"
  7.     )
  8.     if "!folder!" neq "" (
  9.         if exist "!folder!\" (
  10.             move "%%i" "!folder!\"
  11.         )
  12.     ) else (
  13.         echo Cannot find folder for %%i
  14.     )
  15. )
复制代码

作者: 997666    时间: 2017-3-31 15:11

本帖最后由 997666 于 2017-4-26 17:46 编辑

回复 5# ShowCode


    完美执行,感谢!

追问:如果变为“0001AB浇水量研究.pdf”“0003CD花卉供应商名单.pdf”“0005AA除虫记录.pdf”的文件(前4位字符为对象字符),希望可以归置至“0001乔木资料”“0002松树文件”“0005樟树除虫记录”文件夹下(前4位字符为对应规则)。请问代码应如何更改?
作者: WHY    时间: 2017-4-26 22:07

回复 6# 997666


    没做测试
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /ad ^| findstr /b [0-9]0-9][0-9]0-9]') do (
  4.     set "str=%%i"
  5.     move "!str:~0,4!*.pdf" "%%i\"
  6. )
  7. pause
复制代码

作者: 997666    时间: 2017-4-27 10:14

回复 7# WHY


    感谢WHY朋友!




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