标题: [数值计算] [讨论]批处理随机数值创建与应用是否可以有更好的方案 [打印本页]
作者: yakeyun 时间: 2023-3-12 17:19 标题: [讨论]批处理随机数值创建与应用是否可以有更好的方案
比如用如下代码,在当前目录放置4首WAV格式的歌曲,分别命名为1.WAV、2.WAV、3.wav、4.wav。可以通过随机数获取,实现分别播放不同歌曲的目的。
播放步骤调用的是Powershell命令,该命令会在等待歌曲播放结束才会继续执行后面步骤。而通过获取EXE进程是否存在来判断,是否需要继续循环播放歌曲。- @shift /0
- @echo off
- cd /d "%~dp0"
- taskkill /f /t /IM powershell.exe 1>nul 2>nul
- setlocal enabledelayedexpansion
- :run
- set /a music=%random%%%4+1
- if !music!==!music1! (goto run)
- set "music1=%music%"
- powershell -c (New-Object Media.soundPlayer "%music1%.wav").PlaySync();
- tasklist |Find "QQ.exe" >nul && (goto run)
- exit
复制代码
如果歌曲名称不想改变,不想定义为数字,就需要做如下处理:- @shift /0
- @echo off
- cd /d "%~dp0"
- taskkill /f /t /IM powershell.exe 1>nul 2>nul
- setlocal enabledelayedexpansion
- :run
- set /a music=%random%%%4+1
- if !music!==!music1! (goto run)
- set "music1=%music%"
- if !music1!==1 set music1=等一分钟.wav
- if !music1!==2 set music1=听.wav
- if !music1!==3 set music1=夜猫.wav
- if !music1!==4 set music1=爱如火.wav
- powershell -c (New-Object Media.soundPlayer "%music1%.wav").PlaySync();
- tasklist |Find "QQ.exe" >nul && (goto run)
- exit
复制代码
那么如果想用DIR方案来处理,该如何修改,关联批量歌曲文件。
作者: 77七 时间: 2023-3-12 18:14
本帖最后由 77七 于 2023-3-12 18:17 编辑
- @echo off
- set /a n=0
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.wav') do (
- set /a n+=1
- set "#!n!=%%i"
- )
- :run
- set /a "m=%random%%%%n%+1"
- echo play !#%m%!
- pause
- goto :run
复制代码
是这个意思吗?
作者: Five66 时间: 2023-3-12 18:19
给文件名编码(编号)
作者: terse 时间: 2023-3-12 18:36
回复 1# yakeyun
文件数量不多的话可以这样- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /a-d "x:\mp4\*.wav"') do set "arr=!arr! "!random!!random!!random!#%%a""
- for /f "tokens=1* delims=#" %%i in ('"(for %%i in (!arr!) do echo %%~i)|sort"') do echo %%j
- pause>nul
复制代码
作者: yakeyun 时间: 2023-3-12 19:28
本帖最后由 yakeyun 于 2023-3-12 19:41 编辑
回复 2# 77七
是要这个效果,测试可用。不过为了避免下一次播放歌曲和上一首重复,稍作修改,如果判断名称一样的时候,就重新随机一次。- @echo off
- set /a n=0
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.wav') do (
- set /a n+=1
- set "#!n!=%%i"
- )
- :run
- set /a "m=%random%%%%n%+1"
- if !m!==!ms! (goto run)
- set "ms=%m%"
- echo play !#%m%!
- timeout -t 2 >nul
- goto :run
复制代码
作者: yakeyun 时间: 2023-3-12 19:36
回复 4# terse
这个方法也不错,不过还会存在下一首和上一首重复的情况。
作者: terse 时间: 2023-3-12 20:28
回复 6# yakeyun
怎么会有重复呢?你怎么用的
作者: yakeyun 时间: 2023-3-13 10:01
是用的下面这个代码- @echo off&setlocal enabledelayedexpansion
- :run
- for /f "delims=" %%a in ('dir /b /a-d "x:\mp4\*.wav"') do set "arr=!arr! "!random!!random!!random!#%%a""
- for /f "tokens=1* delims=#" %%i in ('"(for %%i in (!arr!) do echo %%~i)|sort"') do echo %%j
- timeout -t 1 >nul
- goto run
- pause>nul
复制代码
回复 7# terse
作者: terse 时间: 2023-3-13 10:26
回复 8# yakeyun 在第三行添加 set "arr="
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |