Regex 使用Powershell在文件名中第二次出现字符串后删除以下所有字符
在我的音乐库中,我有如下文件名:Regex 使用Powershell在文件名中第二次出现字符串后删除以下所有字符,regex,powershell,file-rename,Regex,Powershell,File Rename,在我的音乐库中,我有如下文件名: 艺人-歌曲(专长.其他艺人)(专长.其他艺人).mp4 艺人-歌曲(专长其他艺人)(电台编辑)(专长其他艺人)。mp4 我想要的是删除最后提到的重复功能。这就是我到目前为止的想法: Get ChildItem-Path“Path”-Recurse-Filter*feat*feat*| ForEach对象{$|重命名项-NewName$|.Name.SubString(0,$|.Name.Length-10)} 这将获取所有具有dublicate功能的文件,然后仅
Get ChildItem-Path“Path”-Recurse-Filter*feat*feat*| ForEach对象{$|重命名项-NewName$|.Name.SubString(0,$|.Name.Length-10)}
这将获取所有具有dublicate功能的文件,然后仅删除最后10个字符(不幸的是,包括文件扩展名),如果歌曲具有多个艺术家,甚至是具有更长名称的艺术家,cleary将无法使用
我想我需要正则表达式来实现这一点,但我最多还是一个使用Powershell的初学者,所以我非常感谢您的帮助。正则表达式确实可以做您想做的事情。你只需要做一些与你的第一个过滤器非常相似的事情。这是神奇的字符串:
(.*feat.*?)(\s*\(?feat.*\)\s*)(\..+)
您可以这样使用它(完全跳过ForEach
循环):
下面是这根弦是如何断裂的,以及它所做的一切:
(.*feat.*)(\s\(feat.*\)\s*)(\..[^\.]+)
第一个捕获组(.feat.). 匹配任何字符(行终止符除外)
*在零次和无限次之间匹配上一个令牌,尽可能多地匹配,根据需要返回(贪婪)
专长与角色专长完全匹配(区分大小写)
. 匹配任何字符(行终止符除外)
*? 在零次和无限次之间匹配上一个标记,尽可能少地匹配,根据需要扩展(惰性) 第二捕获组(\s(专长)\s)
\s匹配任何空白字符(相当于[\r\n\t\f\v])
*在零次和无限次之间匹配上一个令牌,尽可能多地匹配,根据需要返回(贪婪)
(匹配字符(字面上(区分大小写)
?在0和1之间匹配上一个令牌,尽可能多地匹配,根据需要返回(贪婪)
专长与角色专长完全匹配(区分大小写)
.匹配任何字符(行终止符除外)
*在零次和无限次之间匹配上一个令牌,尽可能多地匹配,根据需要返回(贪婪)
)匹配字符)字面意思(区分大小写)
\s匹配任何空白字符(相当于[\r\n\t\f\v])
*在零次和无限次之间匹配上一个令牌,尽可能多地匹配,根据需要返回(贪婪) 第三捕获组(\.[^\.]+)
\.与角色匹配。字面意思(区分大小写)
匹配以下列表中不存在的单个字符[^\.]
+在一次和无限次之间匹配上一个令牌,尽可能多地匹配,根据需要返回(贪婪)
在这里查看它的工作情况(我从中得到了字符串分解,但格式更好):试试这个,
$song='Artist-song(feat.OtherArtist)(无线电编辑)(feat.OtherArtist.mp4';($song.Substring(0,$song.LastIndexOf('(feat'))).TrimEnd()
看看它是否适合你。@Santiago Squarzon:我现在有了:Get ChildItem-Path“Path”-Recurse-Filter*feat*feat*| ForEach对象{$|重命名项-NewName$.Name.Substring(0,$|.Name.LastIndexOf('(feat'))})
这似乎有效,谢谢!只有一个问题;它仍然会删除文件扩展名。我如何解决这个问题?您可以使用$\ux.extension
获取ChildItem-Path“Path”-Recurse-Filter*feat*feat*-file | ForEach对象{$extension=$\ux extension$newName=“{0}$extension”-f$\uname.SubString获取文件扩展名(0,$\u.Name.LastIndexOf('(feat')).TrimEnd()重命名项-路径$\u.FullName-NewName$NewName}。很抱歉,无法在此处设置代码格式。
Get-ChildItem -Path .\* -Recurse -Filter *feat*feat* | Rename-Item -NewName {$_.Name -replace '(.*feat.*?)(\s*\(?feat.*\)\s*)(\.[^\.]+)','$1$3'}