Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用Powershell在文件名中第二次出现字符串后删除以下所有字符_Regex_Powershell_File Rename - Fatal编程技术网

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功能的文件,然后仅

在我的音乐库中,我有如下文件名:

  • 艺人-歌曲(专长.其他艺人)(专长.其他艺人).mp4
  • 艺人-歌曲(专长其他艺人)(电台编辑)(专长其他艺人)。mp4
  • 我想要的是删除最后提到的重复功能。这就是我到目前为止的想法:

    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'}