Board logo

标题: [文件操作] 【已解决】bat如何将一堆有序号的文件进行分批归类? [打印本页]

作者: toyerspollors    时间: 2021-6-5 19:42     标题: 【已解决】bat如何将一堆有序号的文件进行分批归类?

本帖最后由 toyerspollors 于 2021-6-7 20:20 编辑

我有几千份文件都在一个文件夹下,文件命名前面都是带有序号的,不过有些地方的序号是断开的,因为丢失过一些文件,并不齐全。现在我想利用批处理,把它们分批归类在不同文件夹内。如序号1到序号20的文件归类到文件夹“1-20”中,序号21到序号40归类到文件夹“21-40”中,以此类推。

批处理最好同时支持以下的两种序号形式,不行的话就分开2个批处理。
第一种序号是:1、10、100、1000
第二种序号是:0001、0010、0100、1000

举例如下
(请无视序号后面部分的中文含义,实属乱掰)
第一种序号形式:
1 豆腐闷猪肉
10 推荐 红烧猪头皮
100 排毒 开水暴打矿泉水
1000 木瓜炖椰子

第二种序号形式:
0001 石头砸豆腐
0010 推荐 胸口碎钻石
0100 排毒 莲子煲DD畏
1000 不可理喻的例子

麻烦帮助一下,借此也能得到学习,谢谢!
作者: qixiaobin0715    时间: 2021-6-5 22:27

本帖最后由 qixiaobin0715 于 2021-6-5 22:29 编辑

最好指定文件后缀,这里是.txt。未测试,可能代码有误,思路应当没问题:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     set "str=%%i"
  5.     for /f "tokens=* delims=0123456789" %%j in ("%%i") do set "str=!str:%%j=!"
  6.     for /f "tokens=* delims=0" %%k in ("!str!") do set "n=%%k"
  7.     set /a "n1=((n-1)/20)*20+1"
  8.     set /a "n2=((m-1)/20+1)*20"
  9.     if not exist !n1!-!n2! md !n1!-!n2!
  10.     move "%%i" "!n1!-!n2!"
  11. )
  12. pause
复制代码

作者: hlzj88    时间: 2021-6-6 01:20

回复 2# qixiaobin0715
纠正一个笔误,第8行的m应当是n。

问一个问题
for /f "tokens=* delims=0123456789" %%j in ("%%i") do set "str=!str:%%j=!"
for /f %%j in ("%%i") do set "str=!str:%%~xj=!"

这两句效果上没有区别,请问你的写法有什么特殊考虑。
作者: qixiaobin0715    时间: 2021-6-6 06:04

回复 3# hlzj88
楼主描述的“带有序号”,我认为文件名是序号+其它字符,而不是以序号命名。具体是什么情况,楼主没说清楚,缺一个例子。
作者: toyerspollors    时间: 2021-6-6 13:29

回复  hlzj88
楼主描述的“带有序号”,我认为文件名是序号+其它字符,而不是以序号命名。具体是什么情况 ...
qixiaobin0715 发表于 2021-6-6 06:04


第一种序号形式:
1 豆腐闷猪肉
10 推荐 红烧猪头皮
100 排毒 开水暴打矿泉水
1000 木瓜炖椰子

第二种序号形式:
0001 石头砸豆腐
0010 推荐 胸口碎钻石
0100 排毒 莲子煲DD畏
1000 不可理喻的例子
作者: newswan    时间: 2021-6-6 14:45

序号后面是空格的话
稍微改一下就好
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set _path_=c:
  4. for /f "tokens=* delims=" %%a in ('dir /b /a-d %_path_%\*.txt') do (
  5.     for /f "tokens=1 delims= " %%a in ("%%a") do set "n=%%a"
  6.     set /a "n1=((n-1)/20)*20+1"
  7.     set /a "n2=((n-1)/20)*20+20"
  8.     if not exist !n1!-!n2! md !n1!-!n2!
  9.     move "%%a" "!n1!-!n2!"
  10. )
复制代码

作者: toyerspollors    时间: 2021-6-6 15:08

谢谢大家的帮助,我先测试一下。回见!
作者: qixiaobin0715    时间: 2021-6-6 15:47

这样的话一个循环即可:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1*" %%i in ('dir /b /a-d *.txt') do (
  4.     set /a "n=%%i"
  5.     set /a "n1=((n-1)/20)*20+1"
  6.     set /a "n2=((n-1)/20+1)*20"
  7.     if not exist !n1!-!n2! md !n1!-!n2!
  8.     move "%%i %%j" "!n1!-!n2!"
  9. )
  10. pause
复制代码

作者: qixiaobin0715    时间: 2021-6-6 15:49

开始以为是:
1豆腐闷猪肉
10推荐 红烧猪头皮
100排毒 开水暴打矿泉水
1000木瓜炖椰子
作者: toyerspollors    时间: 2021-6-6 16:02

这样的话一个循环即可:
qixiaobin0715 发表于 2021-6-6 15:47


第8行的%%j我该如何理解? 我是新手,不要见怪!
作者: toyerspollors    时间: 2021-6-7 20:28

2楼、6楼的批处理目前使用起来暂时没有发现问题,能达到我处理文件的效果。

但是qixiaobin0715重新在8楼写出来新的就不行了,这个只能把每20份归在一起,但是会忽略序号的问题。如:我序号1-20的文件中缺少2个序号,8楼的命令会把21、22放到1-20的文件夹中补齐全了,这不是我要的。
不过前面2楼qixiaobin0715的是能处理,谢谢大家帮助!
作者: newswan    时间: 2021-6-7 23:02

本帖最后由 newswan 于 2021-6-8 10:32 编辑

回复 10# toyerspollors


    %%i 是第一列 %%j 是第二列
    去看 for 教程

    8楼的代码,简单了些,但是有缺陷




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