标题: [文件操作] 批处理怎样在原文件名中插入随机序号? [打印本页]
作者: 墨者革离 时间: 2014-9-7 11:03 标题: 批处理怎样在原文件名中插入随机序号?
有300多个MP4文件,并且不断更新中,放在车载播放器听,U盘中MP4文件总是按名称序次排列,MP4文件的顺序总是不变,我想用一个批处理一键修改他们的排列顺序,隔断时间更新视频文件时执行一次随机排列,为此我想到在每文件名前加个随机数字序号,修改后MP4文件会被打乱重新排列一次,于是找到以下一段代码,但这段代码只能全部重新排序为纯数字,而不能保留原文件名并插入随机序号。
求:在原文件名前插入随机序号,最好是三位数或四位数。不甚感激!
例如:
A.MP4
B.MP4
C.MP4
D.MP4 ...
执行批处理修改文件名后,改成
001.A.MP4
002.B.MP4
003.C.MP4
004.D.MP4 ...
其中MP4文件会不同,像以下这样:
001.B.MP4
002.C.MP4
003.D.MP4
004.A.MP4 ...- @echo off
- setlocal enabledelayedexpansion
- set "n=0"
- for /f "delims=" %%a in ('dir/a/b *.mp4') do call :a "%%a"
- for /f "delims=" %%a in ('dir/a/b/on *.mp4') do set/a "n+=1"&ren "%%a" "!n:~-3!%%~xa"
- echo 处理完成,按任意键退出...
- exit
- :a
- ren "%~1" "%random%%~x1" || goto a
复制代码
作者: apang 时间: 2014-9-8 00:17
- @echo off & setlocal enabledelayedexpansion
- if "%~1" neq "OK" (
- set "n=1000"
- for /f "tokens=2,3delims=|" %%a in ('"%~0" OK ^| sort') do (
- set /a n+=1
- echo ren "%%b" "!n:~1!.%%a"
- )
- pause & exit/b
- ) else (
- for %%a in (*.txt) do (
- for /f "tokens=*delims=0123456789." %%b in ("%%a") do (
- echo,!random!^|%%b^|%%a
- )
- )
- )
复制代码
作者: yu2n 时间: 2014-9-8 02:42
回复 1# 墨者革离
1. 文件无编号的,随机打乱,并添加4位序号- -- 重命名
- [1/6]分开旅行 -> 0001.分开旅行
- [2/6]嘀答 -> 0002.嘀答
- [3/6]范玮琪 - 我们的纪念日 -> 0003.范玮琪 - 我们的纪念日
- [4/6]多少 -> 0004.多少
- [5/6]蝶恋 -> 0005.蝶恋
- [6/6]范玮琪 - 我们可不可以不勇敢 -> 0006.范玮琪 - 我们可不可以不勇敢
- -- 完成
复制代码
2. 文件已编号,重新随机编号- -- 重命名
- [1/6]0002.范玮琪 - 我们可不可以不勇敢 -> 0001.范玮琪 - 我们可不可以不勇敢
- [2/6]0005.分开旅行 -> 0002.分开旅行
- [3/6]0006.范玮琪 - 我们的纪念日 -> 0003.范玮琪 - 我们的纪念日
- [4/6]0003.多少 -> 0004.多少
- [5/6]0004.嘀答 -> 0005.嘀答
- [6/6]0001.蝶恋 -> 0006.蝶恋
- -- 完成
复制代码
3. 已编号的文件,可以取消编号- -- 随机重命名完成!是否需要取消随机序号?[Y/N] y
- 0001.范玮琪 - 我们可不可以不勇敢 -> 范玮琪 - 我们可不可以不勇敢
- 0002.分开旅行 -> 分开旅行
- 0003.范玮琪 - 我们的纪念日 -> 范玮琪 - 我们的纪念日
- 0004.多少 -> 多少
- 0005.嘀答 -> 嘀答
- 0006.蝶恋 -> 蝶恋
- -- 完成
复制代码
代码如下:- @echo off
- title 文件随机排序 By Yu2n@qq.com
-
- :_get_input
- set "strPath=V:\mp3\*.mp3"
- set/p "strPath=请输入文件夹路径,支持通配符,如(%strPath%):"
- if not defined strPath goto :_get_input
- set "strPath=%strPath:"=%"
- if "%strPath:~-1%" equ "\" set "strPath=%strPath:~0,-1%"
- if not exist "%strPath%" goto :_get_input
-
- REM 启用延迟环境变量扩展
- setlocal enabledelayedexpansion
-
- :: 统计个数
- echo -- 统计个数
- call :_get_count
- echo -- 总计 %nCount% 个文件
- echo.
-
- :: 生成随机变量 $n$
- echo -- 生成随机变量 $n$,映射随机变量与路径对应关系
- for /l %%i in (1,1,%nCount%) do (
- call :_rnd %%i
- )
- echo -- 完成
- echo.
-
- echo -- 重命名
- for /l %%i in (1,1,%nCount%) do (
- REM 从随机变量中读取值
- for /f "delims=??" %%j in ('echo,"!$%%i$!"') do (call :_rename "!#%%~j#!" "%%i")
- )
- echo -- 完成
- echo.
-
- set/p p=-- 随机重命名完成!是否需要取消随机序号?[Y/N]
- if /i "%p:~0,1%" equ "y" (
- call :_re_rename
- echo -- 完成
- pause
- )
-
- goto :eof
-
-
- :_rename
- for /f "delims=??" %%i in ('echo,"%~1"') do (
- set "fn1=%~n1"
- for /f "tokens=1,* delims=." %%j in ('echo,"%~n1"') do (
- set/a "sn=%%~j"
- REM 排除多个点号
- if !sn! neq 0 set "fn1=%%~k"
- )
- REM 4 位序号
- set sn=0000%~2
- set sn=!sn:~-4!
- echo [%~2/%nCount%]%~n1 -^> !sn!.!fn1!
- rename "%~1" "!sn!.!fn1!%~x1"
- )
- goto :eof
-
-
- :: 取消随机序号
- :_re_rename
- for /f "delims=??" %%i in ('dir /a-d /b /s "%strPath%"') do (
- for /f "tokens=1,* delims=." %%j in ('echo,"%%~ni"') do (
- set/a "sn=%%~j"
- if !sn! neq 0 (
- echo %%~ni -^> %%~k
- rename "%%~i" "%%~k%%~xi"
- )
- )
- )
- goto :eof
-
-
- :: 统计个数,生成升序变量 #n#
- goto :eof
- :_get_count
- set/a nCount=0
- for /f "delims=??" %%i in ('dir /a-d /b /s "%strPath%"') do (
- set/a nCount=!nCount! + 1
- REM add env
- set "#!nCount!#=%%~i"
- echo !nCount!. %%~i
- )
- goto :eof
-
-
- :: 生成随机变量 $n$
- goto :eof
- :_rnd
- set/a min=1
- set/a max=%nCount%
- set/a num=(%random%) %% (%max% - %min% + 1) + %min%
- if defined $%num%$ goto :_rnd
- REM add env ##
- set $%num%$=%1
- goto :eof
复制代码
作者: 墨者革离 时间: 2014-9-9 16:45
楼上两位高手辛苦了,但我用你们的代码,测试不成功,以下代码是别人帮写的,很实用。研究一下:- @echo off&cd/d %~dp0&set/a n=1000
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=_" %%i in (
- 'dir/b/a-d *.mp4^|findstr/b "[0-9][0-9]*_"')do ren "%%i_%%j" "%%j"
- for %%i in (*.mp4)do set "#!random!=%%i"
- for /f "tokens=1* delims==" %%i in ('set #')do (
- set/a n+=1
- echo !n:~1!_%%j
- ren "%%j" "!n:~1!_%%j"
- )
- set/p=按任意键退出... <nul&EXIT>nul
复制代码
作者: apang 时间: 2014-9-9 18:04
本帖最后由 apang 于 2014-9-9 18:06 编辑
回复 4# 墨者革离
2楼第10行 *.txt 改成 *.mp4,去掉第6行的echo
挑点小毛病:
第5行 for %%i in (*.mp4)do set "#!random!=%%i"
for循环赋值时,如果#!random!值相同,重命名时会遗漏,呵呵
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |