标题: [文本处理] 求BAT脚本批量处理多个文件,分拣成多个文件夹 [打印本页]
作者: asy666 时间: 2023-3-30 02:01 标题: 求BAT脚本批量处理多个文件,分拣成多个文件夹
求BAT脚本批量处理多个文件,分拣成多个文件夹
用途:我想整理一些有声小说,一个文件夹里有1000-3000集的小说,想把文件夹里的小说分成多个文件夹,每个文件夹里500个音频,比如(0001-0500)(0501-1000)(1001-1500)
需要按顺序分文件夹,就是第1集和第500集必须在一个文件夹里。生成的文件夹最好带标号,如(0001-0499)(0500-0999)(1000-1499)这样的格式
求大神帮忙写个代码,本人小白一个,只能求助各位大神了
最好是把脚本放进去,双击直接运行的那种,先谢谢了。
作者: Batcher 时间: 2023-3-30 08:17
回复 1# asy666
请截图发出来看看现在的真实文件名是怎样的?
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: qixiaobin0715 时间: 2023-3-30 08:48
本帖最后由 qixiaobin0715 于 2023-3-30 09:31 编辑
假设有声小说是mp3格式,看看这样有无问题,bat保存为ANSI编码:- @echo off
- set m=500
- set Folder=0001-0500
- md "%Folder%"
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.mp3') do (
- set /a n+=1
- if !n! lss !m! (
- move "%%i" "!Folder!\"
- ) else (
- move "%%i" "!Folder!\"
- set /a m+=500
- set /a n1=n+1
- set /a n2=n+500
- set n1=000!n1!
- set n2=000!n2!
- set Folder=!n1:~-4!-!n2:~-4!
- md "!Folder!
- )
- )
- pause
复制代码
作者: asy666 时间: 2023-3-30 20:23
回复 2# Batcher
原文件
想要的效果
作者: asy666 时间: 2023-3-30 20:28
本帖最后由 asy666 于 2023-3-30 20:30 编辑
假设有声小说是mp3格式,看看这样有无问题,bat保存为ANSI编码:
qixiaobin0715 发表于 2023-3-30 08:48
是这样的大佬,如果我想把文件夹分成(0001-0499)(0500-0999)(1000-1499)(1500-1999)这样的排序 应该怎么改,能帮我改一下吗。
还有 分拣完能比能直接自动关闭,不需要按任意键关闭
作者: buyiyang 时间: 2023-3-30 22:29
- set /a group=500
- setlocal enabledelayedexpansion
- cd /d "%~dp0"
- for /f "delims=" %%i in ('dir /b /a-d *.mp3') do (
- set /a n+=1
- if !n! equ 1 (set "b=%%~ni")
- xcopy "%%i" "!b!\"
- if !n! equ %group% (
- ren "!b!" "!b!-%%~ni"
- set /a n=0
- )
- set "last=%%~ni"
- )
- ren "!b!" "!b!-%last%"
复制代码
作者: asy666 时间: 2023-3-31 01:00
回复 7# buyiyang
对就是这个效果,这个能计算出最后到多少集吗?比如一共1890个音频。最后一个文件夹输出(1500-1890(完))这个的格式
作者: terse 时间: 2023-3-31 01:00
- @echo off&setlocal enabledelayedexpansion
- set md=500
- for /f "delims=" %%i in ('dir /b /a-d *.mp3') do (
- set /a "i=100%%~ni%%10000/md,n=10000+i*500+^!i,m=n+499-^!i"
- set "fd=!n:~1!-!m:~1!\"
- md !fd! 2>nul
- move %%i !fd!
- )
- pause
复制代码
作者: buyiyang 时间: 2023-3-31 13:54
- setlocal enabledelayedexpansion
- cd /d "%~dp0"
- set /a group=500
- for /f "delims=" %%i in ('dir /b /a-d *.mp3') do (
- for /f "tokens=* delims=0" %%a in ("%%~ni") do (
- set /a n=%%a%%%group%
- if !n! equ 1 (set "b=%%~ni")
- xcopy "%%i" "!b!\"
- if !n! equ 0 (ren "!b!" "!b!-%%~ni")
- )
- set "last=%%~ni"
- )
- ren "!b!" "!b!-%last%(完)"
复制代码
作者: asy666 时间: 2023-3-31 15:27
buyiyang 发表于 2023-3-31 13:54
这个是可以的,但是 是复制的那种,分拣好以后,源文件还在那里,还是感谢大佬帮助
作者: asy666 时间: 2023-3-31 17:49
小改3楼代码
xp3000 发表于 2023-3-31 17:43
这个分拣完 是这样的
是什么原因,还有就是音频里有其他格式的,比如 m4a 格式,要怎么添加进去,
大佬能帮我完善一下吗
作者: xp3000 时间: 2023-3-31 19:52
本帖最后由 xp3000 于 2023-4-1 22:42 编辑
- @echo off
- REM 保存为ANSI编码的BAT
- set n=0
- set m=499
- set Folder=0001-0499
- md "%Folder%"
- setlocal enabledelayedexpansion
- for /f "tokens=1,* delims=:" %%a in ('dir /b /a-d /on^|findstr /n /e "\.mp3 \.m4v"') do set x=%%a
- set xx=000%x%
- for /f "delims=" %%i in ('dir /b /a-d /on^|findstr /e "\.mp3 \.m4v"') do (
- set /a n+=1
- if !n! lss !m! (
- move "%%i" "!Folder!\"
- ) else (
- move "%%i" "!Folder!\"
- set /a m+=500
- set /a n1=n+1
- set /a n2=n+500
- set n1=000!n1!
- set n2=000!n2!
- if !m! geq !x! (
- set Folder=!n1:~-4!-!xx:~-4!^(完^)
- ) else (
- set Folder=!n1:~-4!-!n2:~-4!
- )
- md "!Folder!
- )
- )
复制代码
3楼代码小改,刚开始拿700个文件测试遗漏了后面的- @echo off
- REM 移动子文件夹文件到批处理文件夹
- for /f "delims=" %%a in ('dir /a:d /b') do (
- pushd "%%a"
- for /f "delims=" %%b in ('dir /b /a-d "*.*"') do (
- move "%~dp0%%a\%%~nxb" "%~dp0%%~nxb"
- )
- popd
- rd /s /q "%%a"
- )
复制代码
作者: qixiaobin0715 时间: 2023-4-1 13:54
回复 12# xp3000
第8、9行中的dir的用法好像有时会出现问题,如果文件夹中mp3、m4v这2种格式的文件都有,会先显示mp3文件,后显示m4v文件,而不会按照文件名的顺序。第8行括号中的命令可以这样:- dir /b /a-d /on^|findstr /n /e "\.mp3 \.m4v"
复制代码
第9行同样如此这般修改。
作者: asy666 时间: 2023-4-1 14:00
回复 12# xp3000
可以了,大佬,非常的感谢,这样节省我好多时间,大佬牛逼,同时也感谢楼上的几位大佬帮忙。
作者: asy666 时间: 2023-4-1 21:28
回复 xp3000
第8、9行中的dir的用法好像有时会出现问题,如果文件夹中mp3、m4v这2种格式的文件都有,会先 ...
qixiaobin0715 发表于 2023-4-1 13:54
- @echo off
- REM 保存为ANSI编码的BAT
- set n=0
- set m=499
- set Folder=0001-0499
- md "%Folder%"
- setlocal enabledelayedexpansion
- for /f "tokens=1,* delims=:" %%a in ('dir /b /a-d /on^|findstr /n /e "\.mp3 \.m4a"^|findstr /n .') do set x=%%a&set xx=000%%a
- for /f "delims=" %%i in ('dir /b /a-d "*.mp3" "*.m4a"') do (
- set /a n+=1
- if !n! lss !m! (
- move "%%i" "!Folder!\"
- ) else (
- move "%%i" "!Folder!\"
- set /a m+=500
- set /a n1=n+1
- set /a n2=n+500
- set n1=000!n1!
- set n2=000!n2!
- if !m! geq !x! (
- set Folder=!n1:~-4!-!xx:~-4!^(完^)
- ) else (
- set Folder=!n1:~-4!-!n2:~-4!
- )
- md "!Folder!
- )
- )
复制代码
我这样改了,还是会出现你说的问题。
这样的,MP3的 分拣到第一个文件夹了
作者: xp3000 时间: 2023-4-1 22:20
回复 asy666
在原帖子上改了,你没改两行
作者: 77七 时间: 2023-4-1 23:00
本帖最后由 77七 于 2023-4-1 23:02 编辑
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.mp3 *.m4a ^| find /c /v ""') do set c=%%i
- for /l %%l in (0,500,3500) do (
- set m=000%%l
- set /a k=%%l+499
- set n=000!k!
- if !k! geq !c! (
- set l=000!c!
- set "folder=!m:~-4!-!l:~-4!(完)"
- ) else (
- set "folder=!m:~-4!-!n:~-4!"
- )
- md "!folder!"
- for /f "delims=" %%i in ('dir /b /a-d *.mp3 *.m4a') do (
- if "%%~ni" leq "!n:~-4!" (
- move "%%i" "!folder!" 1>nul
- )
- )
- if defined l (
- goto :next
- )
- )
- :next
- ren "0000-0499" "0001-0499"
复制代码
作者: qixiaobin0715 时间: 2023-4-2 10:37
本帖最后由 qixiaobin0715 于 2023-4-4 09:27 编辑
这样应当也行,写的较乱,未仔细审核和测试,只是提供另外一种思路:- @echo off
- for /f "delims=" %%i in ('dir /b /a-d^|find /c ".mp3 .m4v"') do set m1=%%i
- set m2=0
- set m3=4
- setlocal enabledelayedexpansion
- for /l %%i in (499,500,%m1%) do (
- set n=%%i
- set /a n1=%%i-499
- set n1=000!n1!
- set n2=000%%i
- if %%i equ 499 (
- set Folder=0001-0499
- ) else (
- set Folder=!n1:~-4!-!n2:~-4!
- )
- md "!Folder!"
- for /l %%j in (!m2!,1,!m3!) do (
- set x=0%%j
- set y=%%j
- move "!x:~-2!??.mp3" "!Folder!"
- move "!x:~-2!??.m4v" "!Folder!"
- )
- set /a m2=y+1
- set /a m3=m2+4
- )
- if !m1! equ !n! (
- set /a n+=1
- set n1=000!n!
- set n2=000!m1!
- set Folder=!n1:~-4!-!n2:~-4!(完)
- md "!Folder!"
- move "*mp3" "!Folder!"
- move "*m4v" "!Folder!"
- ) else (
- ren "!Folder!" "!Folder!(完)"
- )
- pause
复制代码
后来发现上述代码未考虑周全,错误较多,不必测试了。
作者: asy666 时间: 2023-4-2 12:27
回复 17# 77七
这个可以,谢谢了
作者: asy666 时间: 2023-4-2 12:28
回复 16# xp3000
好了,这次可以了,完美。谢谢大佬
作者: terse 时间: 2023-4-2 13:45
本帖最后由 terse 于 2023-4-3 18:31 编辑
原来的代码理解错误。重写的是按文件名序号,移动到对应文件夹 不知结果是否符合- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.mp3 *.m4v^|find /v /c ""') do set /a n=%%i
- set /an+=10000,d=500,b=d-1
- if %n% gtr 10000 (
- for /l %%i in (10000,!d!,!n!) do (
- set /a "start=%%i,end=start+b,start+=^!(start-10000)"
- if !end! geq !n! (
- set old=!start:~-4!-!n:~-4!(完)
- ) else set old=!start:~-4!-!end:~-4!
- set "_start=1!old:~,2!"
- set "_end=1!old:~5,2!"
- md "!old!" 2>nul
- for /l %%j in (!_start!,1,!_end!) do (
- set s=%%j
- move "!s:~1!*.mp3" "!old!" >nul 2>nul
- move "!s:~1!*.m4v" "!old!" >nul 2>nul
- )
- )
- )
复制代码
作者: qixiaobin0715 时间: 2023-4-3 09:53
本帖最后由 qixiaobin0715 于 2023-4-3 10:29 编辑
18楼写的匆忙,错误较多。结合本帖中各位大佬的思路,简化18楼的代码:- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.mp3 *.m4v^|find /v /c ""') do set m=%%i
- set /a m1=100,m2=104
- set /a m+=10000
- setlocal enabledelayedexpansion
- for /l %%i in (10000,500,%m%) do (
- set /a n1=%%i,n2=%%i+499
- set Folder=!n1:~-4!-!n2:~-4!
- md "!Folder!"
- for /l %%j in (!m1!,1,!m2!) do (
- set x=%%j
- move "!x:~-2!*.mp3" "!Folder!">nul 2>nul
- move "!x:~-2!*.m4v" "!Folder!">nul 2>nul
- )
- set /a m1=x+1,m2=m1+4
- )
- ren "!Folder!" "!Folder:~,5!!m:~1!(完)"
- ren "0000-0499" "0001-0499"
- pause
复制代码
bat另存为ANSI编码
作者: 77七 时间: 2023-4-3 11:35
回复 21# terse
大佬,我试了两段代码,第一个文件夹0001-0499都是移动了500个文件进去
作者: terse 时间: 2023-4-3 12:11
本帖最后由 terse 于 2023-4-3 12:55 编辑
回复 23# 77七
重新翻看一下帖子
楼主的意思应该是按文件名MOVE到对应的文件夹 那样的话就开始就错了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |