PowerShell根据txt文件名清单精准匹配获取flac文件完整路径
问题背景
- 需求为读取txt文件内的音乐条目,每行格式固定为
歌手 - 歌曲名 - 专辑名,示例条目:
Linkin Park - What I've Done - Minutes to Midnight
Red Hot Chili Peppers - Can't Stop - By the Way (Deluxe Edition)
- 目标是匹配本地音乐库中对应音频的完整路径,预期路径格式示例:
C:\Music\Red Hot Chili Peppers\By the Way (Deluxe Edition)\Can’t Stop.flac
C:\Music\Linkin Park\Minutes to Midnight\What I’ve Done.flac
- 最终将所有匹配到的精准路径写入m3u8格式播放清单。
原有脚本故障原因
原脚本运行时输出大量无关文件路径,核心问题有两点:
- 未拆分每行条目的歌手、歌曲名、专辑名字段,直接将整行文本作为文件过滤前缀,完全不符合实际文件存储的路径结构,触发大量误匹配
- 未限制
Get-ChildItem仅返回文件类型,也未做文件名、目录名的精准校验,递归遍历过程中会将所有名称沾边的内容全部写入清单。
修复后可直接运行的脚本
# 路径配置项,可根据实际存储位置修改 $Trackpath = "C:\Users\J-PLEX SERVER\Documents\My scripts\Qobuz Downloader\tracks.txt" $Musicpath = "F:\Music Masters" $Playlistpath = "C:\Users\J PLEXSERVER\Documents\My scripts\Qobuz Downloader\Playlist.m3u8" # 清空历史播放列表内容,避免重复写入 if (Test-Path $Playlistpath) { Remove-Item $Playlistpath -Force } # 逐行读取曲目列表文件 foreach($line in [System.IO.File]::ReadLines($Trackpath)) { # 自动跳过空行 if ([string]::IsNullOrWhiteSpace($line)) { continue } # 按「 - 」分隔符拆分三个字段,自动去除字段前后多余空格 $trackFields = $line -split '\s-\s' if ($trackFields.Count -ne 3) { Write-Warning "条目格式不符合规范,已跳过:$line" continue } $artist = $trackFields[0].Trim() $trackName = $trackFields[1].Trim() $albumName = $trackFields[2].Trim() # 三层校验精准匹配目标文件 Get-ChildItem -Path $Musicpath -Recurse -File -Filter "*.flac" | Where-Object { $_.Name -eq "$trackName.flac" -and $_.Directory.Name -eq $albumName -and $_.Directory.Parent.Name -eq $artist } | Select-Object -ExpandProperty FullName | Add-Content -Path $Playlistpath -Force }
使用说明
- 脚本运行前会自动清空旧播放列表内容,避免多次运行产生重复条目
- 自动识别txt中的空行、格式错误行,输出警告后跳过,不会中断整体执行
- 匹配逻辑严格对齐给出的路径结构:
音乐库根目录\歌手名\专辑名\歌曲名.flac,三层字段完全匹配才会写入清单,不会出现无关文件路径 - 如果需要匹配mp3、wav等其他格式音频,只需修改
-Filter "*.flac"和$_.Name -eq "$trackName.flac"两处的文件后缀即可。
内容的提问来源于stack exchange,提问作者Jay Ross
相关产品推荐
相关产品推荐

