标题: [文件操作] 【已解决】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。未测试,可能代码有误,思路应当没问题:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
- set "str=%%i"
- for /f "tokens=* delims=0123456789" %%j in ("%%i") do set "str=!str:%%j=!"
- for /f "tokens=* delims=0" %%k in ("!str!") do set "n=%%k"
- set /a "n1=((n-1)/20)*20+1"
- set /a "n2=((m-1)/20+1)*20"
- if not exist !n1!-!n2! md !n1!-!n2!
- move "%%i" "!n1!-!n2!"
- )
- 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
序号后面是空格的话
稍微改一下就好- @echo off
- setlocal enabledelayedexpansion
-
- set _path_=c:
- for /f "tokens=* delims=" %%a in ('dir /b /a-d %_path_%\*.txt') do (
- for /f "tokens=1 delims= " %%a in ("%%a") do set "n=%%a"
- set /a "n1=((n-1)/20)*20+1"
- set /a "n2=((n-1)/20)*20+20"
- if not exist !n1!-!n2! md !n1!-!n2!
- move "%%a" "!n1!-!n2!"
- )
复制代码
作者: toyerspollors 时间: 2021-6-6 15:08
谢谢大家的帮助,我先测试一下。回见!
作者: qixiaobin0715 时间: 2021-6-6 15:47
这样的话一个循环即可:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1*" %%i in ('dir /b /a-d *.txt') do (
- set /a "n=%%i"
- set /a "n1=((n-1)/20)*20+1"
- set /a "n2=((n-1)/20+1)*20"
- if not exist !n1!-!n2! md !n1!-!n2!
- move "%%i %%j" "!n1!-!n2!"
- )
- 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 |