微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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*)(\.[^\.]+)

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?