如何使用正则表达式批量去除文件名中的随机后缀?
无需提前过滤的文件名批量去随机后缀方案
你的需求是去除这类文件名末尾的随机字符后缀:
Belinda Carlisle - Mad About You-Xmdtjwmr9zq.mp4
Air Supply - All Out of Love-Jwdzeumnrmi.mp4
Blue Savannah Song - Erasure-Wxoutwk8jv8.mp4
Breathe - How Can I Fall (1988)-Pwz4erdjzra.mp4
现有代码需要先过滤再重命名,这里提供两种无需提前过滤的方法,避免干净文件名出现双重扩展名问题:
方法一:判断后再执行重命名
通过对比原文件名和替换后的文件名,只修改确实需要调整的文件:
Get-ChildItem $targetpath -File | ForEach-Object { # 提取不带扩展名的部分,替换末尾的随机后缀,再拼接扩展名 $newBaseName = $_.BaseName -replace "-[a-z\d]+$", "" $newName = $newBaseName + $_.Extension # 只有新名字和原名字不同时才重命名 if ($newName -ne $_.Name) { Rename-Item -Path $_.FullName -NewName $newName } }
方法二:用正则分组实现条件替换
利用正则的分组匹配,只有命中规则的文件名才会被修改,未命中的保持原名称:
Get-ChildItem $targetpath -File | Rename-Item -NewName { # 正则匹配:分组1是随机后缀前的内容,分组2是扩展名;未匹配则返回原文件名 $_.Name -replace "^(.*)-[a-z\d]+(\.[^.]+)$", '$1$2' } -WhatIf
注:
-WhatIf参数用于预览重命名效果,确认无误后可以删除该参数执行实际修改。
这两种方法都不需要提前过滤文件,干净的文件名会因为替换后和原名称一致,不会被执行重命名操作,自然也不会出现双重扩展名的问题。
内容的提问来源于stack exchange,提问作者betamaxdroid
相关产品推荐
相关产品推荐

