You need to enable JavaScript to run this app. PowerShell随机选影脚本:退出循环保Shell、优化文件名截后缀逻辑
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 11:27:00