如何用PowerShell与正则修改文件名中1080P/720P的大小写?
解决PowerShell批量修改视频文件名中1080P/720P为小写p的问题
正确脚本方案(两种写法)
写法一:正则捕获组+脚本块替换
$validExts = '.mkv', '.mp4', '.mov', '.avi', '.wmv', '.webm', '.avchd', '.flv' Get-ChildItem -File | Where-Object Extension -In $validExts | Where-Object Length -Gt 500mb | Rename-Item -NewName { $_.BaseName -replace '(1080P|720P)', { $_.Groups[1].Value.ToLower() } } -WhatIf
写法二:更简洁的正则替换(推荐)
$validExts = '.mkv', '.mp4', '.mov', '.avi', '.wmv', '.webm', '.avchd', '.flv' Get-ChildItem -File | Where-Object Extension -In $validExts | Where-Object Length -Gt 500mb | Rename-Item -NewName { $_.BaseName -replace '(1080|720)P', '$1p' } -WhatIf
注意:
-WhatIf参数用于预览重命名结果,确认无误后可删除该参数执行实际重命名操作。
原脚本的问题分析
正则表达式匹配逻辑错误
- 你使用的
^.*(1080P|720P)$会匹配整个文件名,替换时会把原文件名的全部内容替换成捕获到的1080P/720P的小写版本,直接丢失前面的文件名内容;^.*(1080P|720P).*$虽然能匹配包含目标字符串的任意位置,但同样存在替换逻辑错误。 - 正确的做法是只精准匹配需要修改的
1080P或720P片段,保留文件名其他部分。
- 你使用的
替换值写法错误
- 你尝试的
$_.Value.ToLower()中,$_在-NewName的脚本块里代表当前文件对象,而非正则匹配结果,文件对象没有Value属性,导致PowerShell直接将字符串.Value.ToLower()拼接到文件名中,出现诸如ISLAND OF THE DOLLS 2023 ENGLISH 1080P.Value.ToLower()的异常结果。
- 你尝试的
效果示例
输入文件名:ISLAND OF THE DOLLS 2023 ENGLISH 1080P.mkv
执行脚本后输出:ISLAND OF THE DOLLS 2023 ENGLISH 1080p.mkv
内容的提问来源于stack exchange,提问作者Vicky Dev
相关产品推荐
相关产品推荐

