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

[数值计算] [讨论]批处理随机数值创建与应用是否可以有更好的方案

比如用如下代码,在当前目录放置4首WAV格式的歌曲,分别命名为1.WAV、2.WAV、3.wav、4.wav。可以通过随机数获取,实现分别播放不同歌曲的目的。
播放步骤调用的是Powershell命令,该命令会在等待歌曲播放结束才会继续执行后面步骤。而通过获取EXE进程是否存在来判断,是否需要继续循环播放歌曲。
  1. @shift /0
  2. @echo off
  3. cd /d "%~dp0"
  4. taskkill /f /t /IM powershell.exe 1>nul 2>nul
  5. setlocal enabledelayedexpansion
  6. :run
  7. set /a music=%random%%%4+1
  8. if !music!==!music1! (goto run)
  9. set "music1=%music%"
  10. powershell -c (New-Object Media.soundPlayer "%music1%.wav").PlaySync();
  11. tasklist |Find "QQ.exe" >nul && (goto run)
  12. exit
复制代码
如果歌曲名称不想改变,不想定义为数字,就需要做如下处理:
  1. @shift /0
  2. @echo off
  3. cd /d "%~dp0"
  4. taskkill /f /t /IM powershell.exe 1>nul 2>nul
  5. setlocal enabledelayedexpansion
  6. :run
  7. set /a music=%random%%%4+1
  8. if !music!==!music1! (goto run)
  9. set "music1=%music%"
  10. if !music1!==1 set music1=等一分钟.wav
  11. if !music1!==2 set music1=听.wav
  12. if !music1!==3 set music1=夜猫.wav
  13. if !music1!==4 set music1=爱如火.wav
  14. powershell -c (New-Object Media.soundPlayer "%music1%.wav").PlaySync();
  15. tasklist |Find "QQ.exe" >nul && (goto run)
  16. exit
复制代码
那么如果想用DIR方案来处理,该如何修改,关联批量歌曲文件。

本帖最后由 77七 于 2023-3-12 18:17 编辑
  1. @echo off
  2. set /a n=0
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /a-d *.wav') do (
  5.         set /a n+=1
  6.         set "#!n!=%%i"
  7. )
  8. :run
  9. set /a "m=%random%%%%n%+1"
  10. echo play !#%m%!
  11. pause
  12. goto :run
复制代码

是这个意思吗?
1

评分人数

bat小白,请多指教!谢谢!

TOP

给文件名编码(编号)

TOP

回复 1# yakeyun
文件数量不多的话可以这样
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /b /a-d "x:\mp4\*.wav"') do set "arr=!arr! "!random!!random!!random!#%%a""
  3. for /f "tokens=1* delims=#" %%i in ('"(for %%i in (!arr!) do echo %%~i)|sort"') do echo %%j
  4. pause>nul
复制代码
1

评分人数

TOP

本帖最后由 yakeyun 于 2023-3-12 19:41 编辑

回复 2# 77七

是要这个效果,测试可用。不过为了避免下一次播放歌曲和上一首重复,稍作修改,如果判断名称一样的时候,就重新随机一次。
  1. @echo off
  2. set /a n=0
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /b /a-d *.wav') do (
  5.         set /a n+=1
  6.         set "#!n!=%%i"
  7. )
  8. :run
  9. set /a "m=%random%%%%n%+1"
  10. if !m!==!ms! (goto run)
  11. set "ms=%m%"
  12. echo play !#%m%!
  13. timeout -t 2  >nul
  14. goto :run
复制代码

TOP

回复 4# terse


这个方法也不错,不过还会存在下一首和上一首重复的情况。

TOP

回复 6# yakeyun
怎么会有重复呢?你怎么用的

TOP

是用的下面这个代码
  1. @echo off&setlocal enabledelayedexpansion
  2. :run
  3. for /f "delims=" %%a in ('dir /b /a-d "x:\mp4\*.wav"') do set "arr=!arr! "!random!!random!!random!#%%a""
  4. for /f "tokens=1* delims=#" %%i in ('"(for %%i in (!arr!) do echo %%~i)|sort"') do echo %%j
  5. timeout -t 1 >nul
  6. goto run
  7. pause>nul
复制代码
回复 7# terse

TOP

回复 8# yakeyun 在第三行添加 set "arr="

TOP

返回列表