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

[文件操作] 批处理怎样在原文件名中插入随机序号?

有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 ...
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "n=0"
  4. for /f "delims=" %%a in ('dir/a/b *.mp4') do call :a "%%a"
  5. for /f "delims=" %%a in ('dir/a/b/on *.mp4') do set/a "n+=1"&ren "%%a" "!n:~-3!%%~xa"
  6. echo 处理完成,按任意键退出...
  7. exit
  8. :a
  9. ren "%~1" "%random%%~x1" || goto a
复制代码

  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" neq "OK" (
  3.     set "n=1000"
  4.     for /f "tokens=2,3delims=|" %%a in ('"%~0" OK ^| sort') do (
  5.         set /a n+=1
  6.         echo ren "%%b" "!n:~1!.%%a"
  7.     )
  8.     pause & exit/b
  9. ) else (
  10.     for %%a in (*.txt) do (
  11.         for /f "tokens=*delims=0123456789." %%b in ("%%a") do (
  12.             echo,!random!^|%%b^|%%a
  13.         )
  14.     )
  15. )
复制代码
1

评分人数

TOP

回复 1# 墨者革离
1. 文件无编号的,随机打乱,并添加4位序号
  1. -- 重命名
  2. [1/6]分开旅行  ->  0001.分开旅行
  3. [2/6]嘀答  ->  0002.嘀答
  4. [3/6]范玮琪 - 我们的纪念日  ->  0003.范玮琪 - 我们的纪念日
  5. [4/6]多少  ->  0004.多少
  6. [5/6]蝶恋  ->  0005.蝶恋
  7. [6/6]范玮琪 - 我们可不可以不勇敢  ->  0006.范玮琪 - 我们可不可以不勇敢
  8. -- 完成
复制代码
2. 文件已编号,重新随机编号
  1. -- 重命名
  2. [1/6]0002.范玮琪 - 我们可不可以不勇敢  ->  0001.范玮琪 - 我们可不可以不勇敢
  3. [2/6]0005.分开旅行  ->  0002.分开旅行
  4. [3/6]0006.范玮琪 - 我们的纪念日  ->  0003.范玮琪 - 我们的纪念日
  5. [4/6]0003.多少  ->  0004.多少
  6. [5/6]0004.嘀答  ->  0005.嘀答
  7. [6/6]0001.蝶恋  ->  0006.蝶恋
  8. -- 完成
复制代码
3. 已编号的文件,可以取消编号
  1. -- 随机重命名完成!是否需要取消随机序号?[Y/N] y
  2. 0001.范玮琪 - 我们可不可以不勇敢  ->  范玮琪 - 我们可不可以不勇敢
  3. 0002.分开旅行  ->  分开旅行
  4. 0003.范玮琪 - 我们的纪念日  ->  范玮琪 - 我们的纪念日
  5. 0004.多少  ->  多少
  6. 0005.嘀答  ->  嘀答
  7. 0006.蝶恋  ->  蝶恋
  8. -- 完成
复制代码
代码如下:
  1. @echo off
  2. title 文件随机排序  By Yu2n@qq.com
  3. :_get_input
  4. set "strPath=V:\mp3\*.mp3"
  5. set/p "strPath=请输入文件夹路径,支持通配符,如(%strPath%):"
  6. if not defined strPath goto :_get_input
  7. set "strPath=%strPath:"=%"
  8. if "%strPath:~-1%" equ "\" set "strPath=%strPath:~0,-1%"
  9. if not exist "%strPath%" goto :_get_input
  10. REM 启用延迟环境变量扩展
  11. setlocal enabledelayedexpansion
  12. :: 统计个数
  13. echo -- 统计个数
  14. call :_get_count
  15. echo -- 总计 %nCount% 个文件
  16. echo.
  17. :: 生成随机变量 $n$
  18. echo -- 生成随机变量 $n$,映射随机变量与路径对应关系
  19. for /l %%i in (1,1,%nCount%) do (
  20.   call :_rnd %%i
  21. )
  22. echo -- 完成
  23. echo.
  24. echo -- 重命名
  25. for /l %%i in (1,1,%nCount%) do (
  26.   REM 从随机变量中读取值
  27.   for /f "delims=??" %%j in ('echo,"!$%%i$!"') do (call :_rename "!#%%~j#!"  "%%i")
  28. )
  29. echo -- 完成
  30. echo.
  31. set/p p=-- 随机重命名完成!是否需要取消随机序号?[Y/N]
  32. if /i "%p:~0,1%" equ "y" (
  33.   call :_re_rename
  34.   echo -- 完成
  35.   pause
  36. )
  37. goto :eof
  38. :_rename
  39.   for /f "delims=??" %%i in ('echo,"%~1"') do (
  40.     set "fn1=%~n1"
  41.     for /f "tokens=1,* delims=." %%j in ('echo,"%~n1"') do (
  42.       set/a "sn=%%~j"
  43.       REM 排除多个点号
  44.       if !sn! neq 0 set "fn1=%%~k"
  45.     )
  46.     REM 4 位序号
  47.     set sn=0000%~2
  48.     set sn=!sn:~-4!
  49.     echo [%~2/%nCount%]%~n1  -^>  !sn!.!fn1!
  50.     rename "%~1" "!sn!.!fn1!%~x1"
  51.   )
  52.   goto :eof
  53.   
  54.   
  55. :: 取消随机序号
  56. :_re_rename
  57.   for /f "delims=??" %%i in ('dir /a-d /b /s "%strPath%"') do (
  58.     for /f "tokens=1,* delims=." %%j in ('echo,"%%~ni"') do (
  59.       set/a "sn=%%~j"
  60.       if !sn! neq 0 (
  61.         echo %%~ni  -^>  %%~k
  62.         rename "%%~i" "%%~k%%~xi"
  63.       )
  64.     )
  65.   )
  66.   goto :eof
  67.   
  68. :: 统计个数,生成升序变量 #n#
  69. goto :eof
  70. :_get_count
  71.   set/a nCount=0
  72.   for /f "delims=??" %%i in ('dir /a-d /b /s "%strPath%"') do (
  73.     set/a nCount=!nCount! + 1
  74.     REM add env
  75.     set "#!nCount!#=%%~i"
  76.     echo !nCount!. %%~i
  77.   )
  78.   goto :eof
  79.   
  80. :: 生成随机变量 $n$
  81. goto :eof
  82. :_rnd
  83.   set/a min=1
  84.   set/a max=%nCount%
  85.   set/a num=(%random%) %% (%max% - %min% + 1) + %min%
  86.   if defined $%num%$ goto :_rnd
  87.   REM add env ##
  88.   set $%num%$=%1
  89.   goto :eof
复制代码
1

评分人数

『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

楼上两位高手辛苦了,但我用你们的代码,测试不成功,以下代码是别人帮写的,很实用。研究一下:
  1. @echo off&cd/d %~dp0&set/a n=1000
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=_" %%i in (
  4. 'dir/b/a-d *.mp4^|findstr/b "[0-9][0-9]*_"')do ren "%%i_%%j" "%%j"
  5. for %%i in (*.mp4)do set "#!random!=%%i"
  6. for /f "tokens=1* delims==" %%i in ('set #')do (
  7.    set/a n+=1
  8.    echo !n:~1!_%%j
  9.    ren "%%j" "!n:~1!_%%j"
  10. )
  11. set/p=按任意键退出... <nul&EXIT>nul
复制代码

TOP

本帖最后由 apang 于 2014-9-9 18:06 编辑

回复 4# 墨者革离


    2楼第10行 *.txt 改成 *.mp4,去掉第6行的echo

挑点小毛病:
第5行 for %%i in (*.mp4)do set "#!random!=%%i"
for循环赋值时,如果#!random!值相同,重命名时会遗漏,呵呵

TOP

返回列表