背景痛点
作为美剧爱好者和 Total Commander (TC) 的重度用户,我经常遇到这样的情况: 下载了一整季的美剧(比如《猎魔人》),视频文件名是规范的 S04E01 格式,但下载的字幕文件通常名字乱七八糟,或者带有各种后缀。
如果直接按列表顺序批量重命名,一旦视频和字幕的排序不一致(比如一个按时间排,一个按名字排),就会导致字幕张冠李戴 。
我需要的是一个智能方案 :
- 正则匹配 :自动识别视频和字幕中的
SxxExx(季数+集数)编号进行匹配,而不是傻傻地按顺序改名。 - 一键操作 :在 TC 里点击一个按钮瞬间完成。
- 支持 NAS :必须能直接在网络共享路径(SMB/UNC路径)下工作,不需要映射盘符。
经过反复调试(踩了不少坑),终于用 PowerShell 完美解决了这个问题。
解决方案:SmartRename.ps1 脚本
这个脚本会自动扫描当前目录下的视频和字幕,提取 SxxExx 进行配对,并将字幕重命名为与视频同名(保留字幕后缀)。
1\. 创建脚本
在你的电脑任意位置(例如 D:\Tools\Scripts\)新建一个文本文件,重命名为 SmartRename.ps1,复制以下代码:
```powershell param([string]$TargetDir)
--- 1. 修复路径问题 ---
if ($TargetDir) { $TargetDir = $TargetDir.Trim().TrimEnd('\') }
--- 2. 设置编码和跳转 ---
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
if ($TargetDir) { Write-Host "Path: [$TargetDir]" -ForegroundColor DarkGray try { Push-Location -LiteralPath $TargetDir -ErrorAction Stop } catch { Write-Host "Error: Can't access directory." -ForegroundColor Red exit } }
Write-Host "Work Dir: $PWD" -ForegroundColor Magenta
--- 3. 扫描文件 ---
$videos = Get-ChildItem -File | Where-Object { $_.Extension -match "\.(mkv|mp4|avi)" } $subs = Get-ChildItem -File | Where-Object { $_.Extension -match "\.(ass|srt|ssa|vtt)" }
if ($subs.Count -eq 0) { Write-Host "No subtitles found." -ForegroundColor Yellow Read-Host "Press Enter..." exit }
--- 4. 自动判断模式 ---
$isTvShow = $false foreach ($v in $videos) { if ($v.Name -match "(?i)(S\d+E\d+)") { $isTvShow = $true; break } } if (-not $isTvShow) { foreach ($s in $subs) { if ($s.Name -match "(?i)(S\d+E\d+)") { $isTvShow = $true; break } } }
--- 5. 执行重命名 ---
if ($isTvShow) {
[美剧模式]
Write-Host "Mode: TV Show (SxxExx)" -ForegroundColor Cyan foreach ($video in $videos) { if ($video.Name -match "(?i)(S\d+E\d+)") { $code = $matches[1] $targetSub = $subs | Where-Object { $_.Name -match "(?i)$code" } if ($targetSub -and ($targetSub.BaseName -ne $video.BaseName)) { $newName = $video.BaseName + $targetSub.Extension Rename-Item -Path $targetSub.FullName -NewName $newName -ErrorAction Stop Write-Host "OK: $code -> $newName" -ForegroundColor Green } } } } elseif ($videos.Count -eq 1) {
[电影模式]
Write-Host "Mode: Movie (Single Video)" -ForegroundColor Cyan $baseName = $videos[0].BaseName foreach ($sub in $subs) { if ($sub.BaseName -ne $baseName) { $newName = $baseName + $sub.Extension Rename-Item -Path $sub.FullName -NewName $newName -ErrorAction Stop Write-Host "OK: Movie -> $newName" -ForegroundColor Green } } } else { Write-Host "Unknown Mode: No SxxExx found and not a single video file." -ForegroundColor Red }
Write-Host "✨ 全部处理完成!窗口将在 5 秒后自动关闭..." -ForegroundColor Yellow Start-Sleep -Seconds 5 ```
使用效果
设置好后,进入 NAS 里的美剧文件夹,点击按钮:
- 脚本会自动弹出黑框。
- 自动跳转到 NAS 路径(显示
Push-Location成功)。 - 自动识别
S01E01这种编号。 - 瞬间把乱七八糟的字幕改成和视频完全一致的文件名。
哪怕你的字幕列表是倒序的,视频是正序的,它也能精准匹配,绝不出错。
希望这个小工具能帮到同样喜欢折腾 NAS 和整理媒体库的朋友!