[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【已解决】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: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
复制代码

TOP

回复 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=!"

这两句效果上没有区别,请问你的写法有什么特殊考虑。
目的,学习批处理

TOP

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

TOP

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


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

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

TOP

序号后面是空格的话
稍微改一下就好
  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. )
复制代码

TOP

谢谢大家的帮助,我先测试一下。回见!

TOP

这样的话一个循环即可:
  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
复制代码

TOP

开始以为是:
1豆腐闷猪肉
10推荐 红烧猪头皮
100排毒 开水暴打矿泉水
1000木瓜炖椰子

TOP

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


第8行的%%j我该如何理解? 我是新手,不要见怪!

TOP

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

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

TOP

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

回复 10# toyerspollors


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

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

TOP

返回列表