PowerShell随机选影脚本:退出循环保Shell、优化文件名截后缀逻辑
流程控制问题修复
原代码问题根源
- while循环仅判断用户输入是否为
q,未将ArrayList的剩余长度纳入终止条件,当列表耗尽后,空数组传入Get-Random会直接触发空参数错误,且循环退出后无任何交互等待,脚本执行完自动关闭窗口 - 手动维护
$TitleCount计数冗余,且计数判断的逻辑放在分支内部,容易出现计数和实际列表长度不同步的问题 - 之前尝试的
Break/Return失效的原因:Return在脚本顶层作用域会直接终止整个脚本执行,Break仅跳出循环但无后续交互拦截,都会导致窗口直接关闭
优化方案
直接将「剩余可选影片数量」纳入while循环的判断条件,从根源上避免空数组传参,循环退出后统一增加交互等待,确保窗口保持打开:
# while判断同时覆盖两个退出场景:用户输入q、列表剩余数量为0 while ($Answer -ne 'q' -and $Listed.Count -gt 0) { echo "`n`n" $RandomFilm = Get-Random -InputObject $Listed # 省略原有业务逻辑... } # 不管是用户主动退出还是列表耗尽,最后统一加等待,窗口不会自动关 Read-Host "`n按回车键关闭窗口"
- 完全移除冗余的
$TitleCount计数逻辑,直接使用ArrayList实时的Count属性判断剩余长度即可,不会出现不同步问题
文件名扩展名裁剪问题修复
原代码问题根源
Trim('.mkv')的设计逻辑是删除字符串首尾所有属于指定字符集合的字符,而非删除固定的.mkv后缀。它会把参数里的每个字符拆成匹配项(也就是.、m、k、v这四个字符),只要字符串首尾出现这四个字符中的任意一个,就会被持续裁剪直到遇到不匹配的字符。比如文件名V字仇杀队.mkv裁剪后会变成字仇杀队,完全不符合预期。
优化方案
根据实际场景选择对应精确匹配逻辑:
- 如果文件名包含完整路径,优先使用.NET内置的路径处理方法,兼容性最高:
# 自动识别文件最后一个扩展名并移除,不会误删文件名本身的字符 $cleanFilmName = [System.IO.Path]::GetFileNameWithoutExtension($RandomFilm) - 如果仅需要删除固定的
.mkv后缀,用正则锚定字符串末尾匹配:# $锚定字符串末尾位置,仅匹配结尾精确的.mkv字符串,不会触碰文件名其他位置的字符 $cleanFilmName = $RandomFilm -replace '\.mkv$',''
优化后完整参考脚本
# 获取最新的影片列表文件 $LastFile = (Get-Item "F:\DATA\Films list\*" | Where-Object {$_.Name -match "Title"} | Sort-Object LastWriteTime | Select-Object -Last 1).FullName # 加载影片列表,过滤4K内容,直接转为ArrayList避免循环添加的冗余代码 $TitleList = Get-Content $LastFile | Where-Object { $_ -notmatch "4K" } $Listed = [System.Collections.ArrayList]@($TitleList) Write-Host "当前可用影片总数:$($Listed.Count)" Write-Host "_________________________________________________________________________________________" $Answer = Read-Host "按回车随机抽取影片,输入q退出程序" # 循环判断:用户没输q 且 列表还有剩余影片 while ($Answer -ne 'q' -and $Listed.Count -gt 0) { echo "`n`n" $RandomFilm = Get-Random -InputObject $Listed # 精确移除扩展名 $cleanFilmName = [System.IO.Path]::GetFileNameWithoutExtension($RandomFilm) Write-Host $cleanFilmName -ForegroundColor Green # 移除已抽选的影片 $Listed.Remove($RandomFilm) # 如果列表已经空了,提示并跳出循环 if ($Listed.Count -eq 0) { Write-Host "`nEND OF LIST,所有影片已抽选完毕..." -ForegroundColor red break } echo "_________________________________________________________________________________________" $Answer = Read-Host "按回车抽取下一部,输入q退出程序" } # 统一加退出等待,避免窗口自动关闭 Read-Host "`n按回车键关闭窗口"
内容的提问来源于stack exchange,提问作者ilRobby
相关产品推荐
相关产品推荐

