标题: [文件操作] 求助批处理如何按日期自动播放音乐? [打印本页]
作者: tmp05 时间: 2023-9-16 09:15 标题: 求助批处理如何按日期自动播放音乐?
d:\mp3文件夹里一堆mp3文件,如何按日期每天随机抽取20首自动播放(不能重复)?谢谢!
作者: 77七 时间: 2023-9-16 11:32
请具体说说,按日期每天 有哪些含义?和每次有什么区别?
作者: thp2008 时间: 2023-9-16 19:19
本帖最后由 thp2008 于 2023-9-16 19:21 编辑
这个估计比较难以实现,大部分播放器对命令行的支持并不好,功能并不全。有个变通的方法,就是将你D:\mp3目录,从今天的日期开始创建子目录,每天的日期子目录中,都随机移动20个mp3进去,直到你所有mp3移动完。然后,你每天按对应的日期,播放对应日期的子目录下的20个MP3就好了,这样只要你本身MP3文件不重复,也就不存在重复。
保存为xxx.ps1
ANSI编码。
如果不允许运行Powershell脚本,Powershell 管理员权限运行,Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 选Y。- # 指定 MP3 文件夹路径
- $mp3FolderPath = "D:\mp3"
-
- # 获取文件夹内的所有 MP3 文件
- $mp3Files = Get-ChildItem -Path $mp3FolderPath -Filter "*.mp3"
-
- # 获取 MP3 文件总数
- $totalCount = $mp3Files.Count
-
- # 每组文件数
- $groupSize = 20
-
- # 获取今天的日期
- $todayDate = Get-Date
-
- # 循环创建子文件夹并移动文件
- for ($i = 1; $i -le $totalCount; $i += $groupSize) {
- # 创建子文件夹名称,使用日期命名
- $folderName = $todayDate.ToString("yyyyMMdd")
-
- # 检查文件夹是否已存在,如果存在,增加一个后缀
- $suffix = 1
- while (Test-Path (Join-Path -Path $mp3FolderPath -ChildPath $folderName)) {
- $folderName = $todayDate.AddDays($suffix).ToString("yyyyMMdd")
- $suffix++
- }
-
- # 创建子文件夹
- $folderPath = Join-Path -Path $mp3FolderPath -ChildPath $folderName
- New-Item -ItemType Directory -Path $folderPath
-
- # 计算每组的起始和结束索引
- $start = $i - 1
- $end = [math]::Min($start + $groupSize - 1, $totalCount - 1)
-
- # 移动文件到子文件夹中
- $mp3Files[$start..$end] | ForEach-Object {
- $destinationPath = Join-Path -Path $folderPath -ChildPath $_.Name
- Move-Item -Path $_.FullName -Destination $destinationPath
- }
-
- # 使用日期加一天
- $todayDate = $todayDate.AddDays(1)
- }
-
- Write-Host "MP3 文件已按要求分组并移动到子文件夹中。"
复制代码
Ai帮你写的,我也不怎么懂
作者: jyswjjgdwtdtj 时间: 2023-9-16 19:31
回复 3# thp2008
或可使用wmplayer.ocx?再说都用ps了还担心不能播放?
作者: thp2008 时间: 2023-9-16 19:39
你再弄好了上一步后,我再给你弄个播放脚本,你点击后,就只播放当天日期的文件夹的音乐,这样就实现了,你说的,按日期,20首,每天不重复的要求。
但是每次播放器都不一样,我以我用的播放器为例,给你参考。我用的是PotPlayer
保存为ANSI,我在我的电脑上测试没有问题。- @echo off
- setlocal enabledelayedexpansion
-
- rem 获取当前日期并格式化为YYYYMMDD
- for /f "tokens=1-3 delims=/" %%a in ("%date%") do (
- set "year=%%a"
- set "month=%%b"
- set "day=%%c"
- )
-
- rem 去掉星期几信息,设置文件夹路径
- set "datevar=!year!!month!!day!"
- set "datevar=!datevar:~0,8!" rem 仅保留年月日部分
- set "datePath=D:\mp3\!datevar!"
-
- rem 检查日期路径是否存在
- if exist "%datePath%" (
- rem 启动 PotPlayer Mini 播放该路径下的音乐
- "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "%datePath%" /autoplay
- ) else (
- echo 文件夹 %datePath% 不存在。
- )
-
- endlocal
复制代码
作者: Five66 时间: 2023-9-16 20:16
回复 3# thp2008
播放器可以用第三方的ffplay- set SDL_AUDIODRIVER=directsound
- ffplay.exe -autoexit -nodisp "123.mp3"
复制代码
作者: thp2008 时间: 2023-9-16 20:56
我又让Ai帮你做了个,让你可以选择最近7天的菜单去播放。
我测试了一下,还挺不错。- @echo off
- setlocal enabledelayedexpansion
-
- rem 获取今天的日期并格式化为YYYYMMDD
- for /f "tokens=1-3 delims=/" %%a in ("%date%") do (
- set "year=%%a"
- set "month=%%b"
- set "day=%%c"
- )
-
- rem 去掉星期几信息,设置文件夹路径
- set "datevar=!year!!month!!day!"
- set "datevar=!datevar:~0,8!" rem 仅保留年月日部分
-
- echo.
- echo 请选择需要播放的日期:
- echo.
- rem 创建日期菜单
- for /l %%i in (1,1,7) do (
- set "nextDate=!datevar:~0,4!!datevar:~4,2!!datevar:~6,2!"
- echo [%%i] !nextDate!
- if %%i lss 7 echo.
- set /a "datevar=datevar + 1"
- )
-
- echo.
- set /p "choice=请选择要播放音乐的日期(1-7): "
- if "%choice%" geq "1" if "%choice%" leq "7" (
- rem 获取选择菜单上的日期并构建路径
- set /a "selectedDate=%choice%-1"
- set "datePath="
- set /a "day=%date:~8,2%+selectedDate"
- set "month=%date:~5,2%"
- set "year=%date:~0,4%"
-
- rem 设置文件夹路径
- set "datevar3=!year!!month!!day!"
- set "datePath=D:\mp3\!datevar3!"
-
- rem 检查日期路径是否存在
- if exist "!datePath!" (
- rem 启动 PotPlayer Mini 播放该路径下的音乐
- start "" "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "!datePath!" /autoplay
- ) else (
- echo 文件夹 "!datePath!" 不存在。
- )
- ) else (
- echo 无效的选择。
- )
-
- endlocal
复制代码
作者: thp2008 时间: 2023-9-16 21:09
主要是PotPlayer你调整好界面后,关闭后,每次打开,都能看到跟上次调整好一样的界面,并且可以调整播放进度,音量、音效、也有播放列表清单,供你查看与选择,像90年代的Winamp。感觉还可以。我用了一会儿,还不错
作者: tmp05 时间: 2023-9-17 07:57
回复 2# 77七
如今天9月17日,就在d:\mp3下自动建立20230917文件夹,然后从d:\mp3随机移动20个mp3文件到这文件夹并自动播放
作者: Batcher 时间: 2023-9-17 10:17
回复 9# tmp05
测试5楼代码遇到什么问题了吗?
作者: thp2008 时间: 2023-9-17 18:37
回复 tmp05
测试5楼代码遇到什么问题了吗?
Batcher 发表于 2023-9-17 10:17
你是说 "C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe" "!datePath!" /autoplay 前面没加start "" ,这个是我自已加上去的,Ai没加,我测试后,发现不能自动退出。后面就加上了。
rem 仅保留年月日部分 还是说,这部分,从写法上来说,不应该放在后面,应该放在上面,但是我也奇怪,在Windows 11 和 Windows 10 上都测试正常。
还是说,这个年月日的获取方式,我不明白,Ai怎么要用这么多步骤获取,不是%date:~0,4%%date:~5,2%%date:~8,2% 就解决了,我也不懂。而且,它经常给出的年月日变量,都是带星期的,感觉也不是那么聪明,经常,要测试几次,反馈给它才能运行正常。
作者: 77七 时间: 2023-9-17 19:03
- @echo off
- rem 批处理保存为utf-8编码格式
- chcp 65001 >nul
- set "folder=D:\mp3"
- set /a m=0,n=20
- if not exist "%folder%\list.txt" (
- cd.>"%folder%\list.txt"
- )
-
- :1
- setlocal
- for /f "useback delims=" %%a in ("%folder%\list.txt") do (
- set _"%%a"=1
- )
- for /f "delims=" %%i in ('dir /b /a-d "%folder%\*.mp3" "%folder%\*.flac"') do (
- if not defined _"%%i" (
- call set #%%random%%=%%i
- set /a m+=1
- )
- )
- if %m% lss %n% (
- cd.>"%folder%\list.txt"
- endlocal
- goto :1
- )
- for /f "tokens=1* delims==" %%a in ('set #') do (
- echo 播放 [%%b]
- rem 自行设置播放器
- mpv --window-minimized "%folder%\%%b"
- >>"%folder%\list.txt" echo %%b
- set /a n-=1,1/n 2>nul || exit
- )
复制代码
作者: Batcher 时间: 2023-9-18 09:56
回复 11# thp2008
%date:~0,4%%date:~5,2%%date:~8,2%不一定能解决,原因参考:
http://bbs.bathome.net/thread-3328-1-1.html
作者: tmp05 时间: 2023-9-19 16:10
期待实测通过的版本
作者: 77七 时间: 2023-9-19 16:22
如果设置个播放器都不愿意动动手,要不配个秘书吧...
作者: Batcher 时间: 2023-9-19 16:29
回复 14# tmp05
我们一般是这样玩的:
5楼有一个代码、12楼有另一个代码。
你亲自去测试这些代码。
如果测试过程中遇到了问题,给他们反馈一下详细信息,他们帮你继续修改代码。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |