找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21203|回复: 8

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

[复制链接]
发表于 2023-3-12 17:19:18 | 显示全部楼层 |阅读模式
比如用如下代码,在当前目录放置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方案来处理,该如何修改,关联批量歌曲文件。
发表于 2023-3-12 18:14:12 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
yakeyun + 1 乐于助人

查看全部评分

发表于 2023-3-12 18:19:34 | 显示全部楼层
给文件名编码(编号)
发表于 2023-3-12 18:36:48 | 显示全部楼层
回复 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技术 +1 收起 理由
yakeyun + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-3-12 19:28:56 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2023-3-12 19:36:15 | 显示全部楼层
回复 4# terse


这个方法也不错,不过还会存在下一首和上一首重复的情况。
发表于 2023-3-12 20:28:52 | 显示全部楼层
回复 6# yakeyun
怎么会有重复呢?你怎么用的
 楼主| 发表于 2023-3-13 10:01:43 | 显示全部楼层
是用的下面这个代码
  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
发表于 2023-3-13 10:26:52 | 显示全部楼层
回复 8# yakeyun 在第三行添加 set "arr="
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 01:18 , Processed in 0.021898 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表