中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]关于随机播放的几个代码,附完美代码。
作者:
标题: [讨论]关于随机播放的几个代码,附完美代码。 上一主题 | 下一主题
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『楼 主』:  [讨论]关于随机播放的几个代码,附完美代码。

第一个,抄来的。特点是随机列表顺序播放。每首歌开随机变量随机编号然后通过排序输出,保证每首歌随机播放一次。
@echo off
for /r %%i in (*.mp3,*.wma) do call set $%%random%%=%%i
for /f "tokens=2 delims==" %%i in ('set $') do "C:\Program Files\MPlayer\mplayer.exe" "%%i"
第二个,也是抄来的。特点是顺序列表随机播放。每首歌开变量顺序编号,然后按随机数对号播放,不用排序。
@echo off
setlocal enabledelayedexpansion
for /r %%i in (*.mp3,*.wma) do (set /a n+=1&set n!n!=%%i)
:loop
set /a i=%random%%%n+1
"C:\Program Files\MPlayer\mplayer.exe" "!n%i%!"
goto loop
第三个,我自己的。特点是没有列表,要播歌得现找。不开变量编号,不排序,仅按随机数找歌播放。
@echo off
setlocal enabledelayedexpansion
set n=32767
:loop
set /a i=%random%%%n+1,j=0
for /r %%a in (*.mp3,*.wma) do (
    set /a j+=1
    if !j! == %i% ("C:\Program Files\MPlayer\mplayer.exe" "%%a"&goto loop)
)
set n=%j%&goto loop
或下面的代码,也实现同样功能。
@echo off
set n=32768
:loop
set /a i=%random%%%n+1
for /f "tokens=1* delims=:" %%a in ('dir/b/s *.mp3,*.wma ^|findstr /n .*') do (
    if %%a equ %i% ("C:\Program Files\MPlayer\mplayer.exe" "%%b"&goto loop)
    set j=%%a
)
set n=%j%&goto loop
这三个都没有临时文件,
有不同方案的来讨论下啊,不要有临时文件哦。

第四个,又抄了个方案,这个似乎更巧妙了些。直接利用扫描结果排序输出,不用开一大堆变量。也保证每首歌随机播放一次。
@echo off
if "%1" NEQ "$" (
    for /f "tokens=2 delims==" %%a in ('"%~0" $^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
) else for /r %%i in (*.mp3,*.wma) do call echo %%random%%=%%i
这不应该算是另一个方案,只是把无奈何版主的代码(上面第四个)改了下,
@echo off
for /f "tokens=2 delims==" %%a in ('^(for /r %%i in ^(*.mp3,*.wma^) do call rndmark.bat %%i^)^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
遗憾多了个rndmark.bat,谁能帮我精简下啊。rndmark.bat的代码如下:
@echo %random%=%*
感谢6楼的提点,进一步修改如下,
@echo off
if "%~1"=="k" echo %random%=%2&goto :EOF
for /f "tokens=2 delims==" %%a in ('^(for /r %%i in ^(*.mp3,*.wma^) do call %0 k "%%i"^)^|sort') do "C:\Program Files\MPlayer\mplayer.exe" %%a
下面不用if判断,改用for判断,
@echo off
for %%i in (%1) do (for /r %%j in (*.mp3,*wma) do call echo %%random%%=%%j)&goto :EOF
for /f "tokens=2 delims==" %%a in ('"%~0" 1^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
再次修改,算是完美代码了吧,没有if判断了,也不用另外的for来判断了。
@echo off
(for %1 %%i in (*.mp3,*.wma) do call echo %%random%%=%%i)%3>nul&%2:EOF
for /f "tokens=2 delims==" %%a in ('"%~0" /r,goto,2^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
或,^_^
@echo off&%x%
set "x=(for /r %%i in (*.mp3,*.wma) do call echo %%random%%=%%i)&goto:EOF"
for /f "tokens=2 delims==" %%a in ('"%~0"^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
或,^_^
@echo off&%~1
for /f "tokens=2delims==" %%a in ('%~0 "(for /r %%i in (*.mp3,*.wma)do call echo %%^random%%=%%i)&goto:EOF"^|sort')do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
[ Last edited by linee on 2009-1-7 at 14:21 ]

   此帖被 +4 点积分     点击查看详情   
评分人:【 HAT 分数: +4  时间:2009-1-1 01:10


2008-12-31 19:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pusofalse
银牌会员




积分 1604
发帖 646
注册 2008-4-13
状态 离线
『第 2 楼』:  

第三种应该会出错,因为歌曲的数目是未知的啊,若i=32766%%32767+1呢,你的目录中可能没有那么多歌曲。



心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2008-12-31 21:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by pusofalse at 2008-12-31 21:21:
第三种应该会出错,因为歌曲的数目是未知的啊,若i=32766%%32767+1呢,你的目录中可能没有那么多歌曲。

这个考虑过了,没问题的,进入循环完整扫描一次后歌曲数目就变已知了。因为,假若随机数i大于你的歌曲数目的话,那本次for循环会找不到歌来播,也正是利用这点来进行一次完整的扫描,从而取得歌曲数目,这种情况只会有一次。知道歌曲数目后随机数i就不会大于歌曲数目了,也就总能找到歌来播了。

[ Last edited by linee on 2008-12-31 at 21:53 ]

2008-12-31 21:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 4 楼』:  

这不应该算是另一个方案,只是把无奈何版主的代码改了下,
@echo off
for /f "tokens=2 delims==" %%a in ('^(for /r %%i in ^(*.mp3,*.wma^) do @call rndmark.bat %%i^)^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
遗憾多了个rndmark.bat,谁能帮我精简下啊。rndmark.bat的代码如下:
@echo %random%=%*
[ Last edited by linee on 2009-1-2 at 14:39 ]

2009-1-1 17:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 5 楼』:  

又搞了个方案,不过不算是新的,相当于是第三个的变种,就当是练习命令吧。4楼的问题真的无解么?
@echo off
set n=32768
:loop
set /a i=%random%%%n+1
for /f "tokens=1* delims=:" %%a in ('dir/b/s *.mp3,*.wma ^|findstr /n .*') do (
    if %%a equ %i% ("C:\Program Files\MPlayer\mplayer.exe" "%%b"&goto loop)
    set j=%%a
)
set n=%j%&goto loop
[ Last edited by linee on 2009-1-3 at 20:58 ]

2009-1-3 17:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 6 楼』:  看这样行吗?

@echo off
if "%~1"=="k" goto :rndmak
for /f "tokens=2 delims==" %%a in ('^(for /r %%i in ^(*.mp3,*.wma^) do @call %0 k %%i^)^|sort') do "C:\Program Files\MPlayer\mplayer.exe" "%%a"
goto :eof

:rndmak
shift
echo %random%=%*

[ Last edited by netbenton on 2009-1-4 at 01:12 ]



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-3 23:52
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by netbenton at 2009-1-3 23:52:
@echo off
if "%~1"=="k" goto :rndmak
for /f "tokens=2 delims==" %%a in ('^(for /r %%i in ^(*.txt,*.wma^) do @call %0 k %%i^)^|sort') do "C:\Program Files\MPlaye ...

感谢提点,虽然还是要用if,也不失为一种方法。好想那个位置能用%random%就完美了,呵呵。你这个要改一下,因为盘符前多个k和空格。
下面是我改的。
@echo off
if "%~1"=="k" echo %random%=%2&goto :EOF
for /f "tokens=2 delims==" %%a in ('^(for /r %%i in ^(*.mp3,*.wma^) do call %0 k "%%i"^)^|sort') do echo %%a
[ Last edited by linee on 2009-1-4 at 00:52 ]

2009-1-4 00:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 8 楼』:  

哦!没看清是%*
改成是%1就可以了.

不过,你的更好.



精简
[你的+我的+他的]=>[大家的]    个人网志   
2009-1-4 01:10
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 9 楼』:  

再来个第四个的变种,不用if判断的,改用for判断,我也是第一次用for来判断。
@echo off
for %%i in (%1) do (for /r %%j in (*.mp3,*wma) do call echo %%random%%=%%j)&goto :EOF
for /f "tokens=2 delims==" %%a in ('"%~0" 1^|sort') do echo %%a


2009-1-4 21:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 10 楼』:  

完美代码出现了,不用if判断,也不用另外的for来判断了。
@echo off
(for %1 %%i in (*.mp3,*.wma) do call echo %%random%%=%%i)%3>nul&%2:EOF
for /f "tokens=2 delims==" %%a in ('"%~0" /r,goto,2^|sort') do echo %%a
自认为很完美了,谁还能优化就请提出来吧。

[ Last edited by linee on 2009-1-6 at 12:44 ]

2009-1-5 13:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 11 楼』:  

还可以这样实现,迷人吧。^_^
@echo off&%x%
set "x=(for /r %%i in (*.mp3,*.wma) do call echo %%random%%=%%i)&goto:EOF"
for /f "tokens=2 delims==" %%a in ('"%~0"^|sort') do echo %%a
[ Last edited by linee on 2009-1-6 at 12:59 ]

2009-1-6 12:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
linee
初级用户





积分 94
发帖 49
注册 2008-12-14
状态 离线
『第 12 楼』:  

还可以这样,^_^
@echo off&%~1
for /f "tokens=2delims==" %%a in ('%~0 "(for /r %%i in (*.mp3,*.wma)do call echo %%^random%%=%%i)&goto:EOF"^|sort')do echo %%a


2009-1-7 14:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: