使用Powershell在文件名中第二次出现字符串后删除以下所有字符



在我的音乐库中,我有这样的文件名:

  1. 艺术家-歌曲(feat.OtherArtist((feat.OtherArtist(.mp4
  2. 艺术家-歌曲(feat.OtherArtist((电台编辑((feat.OtherArtist(.mp4

我想要的是删除最后提到的重复功能。这就是我到目前为止想到的:

Get-ChildItem -Path "path" -Recurse -Filter *feat*feat* | ForEach-Object { $_ | Rename-Item -NewName $_.Name.SubString(0,$_.Name.Length -10) }

这会得到所有具有重复功能的文件,然后只删除最后10个字符(不幸的是,包括文件扩展名(,如果歌曲中有多个艺术家,甚至是名字更长的艺术家,这显然是行不通的。

我想我需要正则表达式,但我最多还是一个使用Powershell的初学者,所以我非常感谢您的帮助。

RegEx确实可以随心所欲。你只需要做一些与你的第一个过滤器非常相似的事情。这是魔术串:

(.*feat.*?)(s*(?feat.*)s*)(..+)

您可以这样使用它(完全跳过ForEach循环(:

Get-ChildItem -Path .* -Recurse -Filter *feat*feat* | Rename-Item -NewName {$_.Name -replace '(.*feat.*?)(s*(?feat.*)s*)(.[^.]+)','$1$3'}

下面是这个字符串是如何分解的,以及它所做的一切:

(.*feat.*((\s\(feat.*\(\s*((\.[^\.]+(

第一个捕获组(.fatt.(
。匹配任何字符(行终止符除外(
*在零次和无限次之间匹配前一个令牌,尽可能多次,根据需要回馈(贪婪(
壮举匹配字符壮举(区分大小写(
。匹配任何字符(行终止符除外(
*?在零次和无限次之间匹配上一个令牌,尽可能少地匹配,根据需要扩展(惰性(

第二个捕获组(\s(feat.(\s(
\s匹配任何空白字符(相当于[\n\t\f\v](
*在零次和无限次之间匹配前一个令牌,尽可能多次,根据需要进行回馈(贪婪(
(匹配字符(字面上(区分大小写(
?在0到1次之间匹配上一个令牌,尽可能多次,根据需要回馈(贪婪(
feat从字面上匹配字符feat(区分大小写(
。匹配任何字符(行终止符除外(
*在零和无限次之间匹配上一个令牌,尽可能多次,根据需要回馈(贪婪(
(匹配字符(字面上(区分大小写(
>\t匹配任何空白字符(相当于[\n\t\f\v](,尽可能多次,根据需要回馈(贪婪(

第三捕获组(\.[^\.]+(
\。匹配字符。字面上(区分大小写(
匹配下面列表中不存在的单个字符[^\.]
+在一次和无限次之间匹配前一个令牌,尽可能多次,根据需要反馈(贪婪(

在这里看到它的工作(我从这里得到了字符串分解,但格式要好得多(:https://regex101.com/r/FWlNLi/1

最新更新