如何在指定字符之后从多个文件名中删除所有字符 - Powershell

How to remove all characters from multiple filenames after specified characters - Powershell

如果我解释得不好,请原谅我,我是 PowerShell 的新手。

我正在尝试清理我的媒体文件,并且我正在尝试从包含一个目录的所有子目录的多个文件中删除指定字符串后的所有字符。

文件名长度将不一致。但是文件类型会。我也需要排除扩展名被删除的可能性。

所以文件看起来像这样:

  1. TVshow S01 E01 剧集名称.mp4
  2. LongerTVShow S03 E01 剧集名称.mp4

我想删除 E01 之后的所有内容,同时保留 E01

结果:

  1. TVshow S01 E01.mp4
  2. LongerTVShow S03 E01.mp4

我目前还有一些其他行正在清除我指定的字符,例如查找句点并将其替换为空格:

get-childitem -recurse | dir -Filter *.mp4 | Rename-Item -NewName { $_.BaseName.replace('.',' ') + $_.Extension }

效果很好,因为它将应用于目录中的所有文件。但是需要指定要替换的字符。

然后我打算对 E01、E02、E03 等使用多个命令实例。以同样的方式我删除了多个 stings,如下面的代码:

get-childitem -recurse | dir -Filter *.txt | Rename-Item -NewName { $_.BaseName.replace('1080p','').replace('720p','').replace('HD','') + $_.Extension }

我希望使用相同的东西,我看到了 trim 或拆分的建议,但我似乎无法弄清楚,我也找不到任何东西。

感谢您的回答!


编辑

我使用了 AdminOfThings 的代码并将其添加到我现有的代码中。

get-childitem -recurse |dir -Filter *.mp4 | Rename-Item -NewName { ($_.BaseName -creplace '(?<=S\d+ E\d+)\D.*') + $_.Extension }

因此,如果将来有人需要这样的东西,这将重命名该目录及其 运行 所在的所有子目录中的所有 .mp4 文件。特别是在 E01、E02、E03 等之后的任何内容。导致以下:

  1. 电视秀 S01 E04 title_of_show.mp4
  2. TvShow S08 E03Title_of_show.mp4

进入:

  1. 电视秀 S01 E04.mp4
  2. 电视秀S08 E03.mp4

非常具体,但有人可能会觉得这很有用。

这很长,但是这个怎么样:

dir -Filter *.mp4 | Rename-Item -NewName { $_.BaseName.Split(' ')[0] + ' ' + $_.BaseName.Split(' ')[1] + ' ' + $_.BaseName.Split(' ')[2] + $_.Extension }

您可以执行以下操作:

Get-ChildItem -Recurse -Filter *.txt -File |
    Rename-Item -NewName { ($_.BaseName -creplace '(?<=S\d+ E\d+)\D.*') + $_.Extension }

解释:

-creplace 运算符执行区分大小写的正则表达式匹配(-replace 不区分大小写),然后进行字符串替换。如果没有使用字符串替换,那么匹配的字符串只是替换为空字符串。

正则表达式字符串是 (?<=S\d+ E\d+)\D.*

  • (?<=) 是一种积极的后视机制。这意味着字符串中的当前位置必须具有与回顾表达式匹配的先前字符。
  • S\d+ 匹配文字 sS 和一个或多个 (+) 数字 (\d)。在我们的例子中,只有 S 被匹配,因为我们使用的是 -creplace\d+ 之后的 space 是文字 space.
  • E\d+ 匹配文字 E 和一位或多位数字。
  • \D 匹配非数字字符。这是必需的,以便 lookbehind \d+ 不会返回任何数字。它允许我们当前在一个非数字上并且知道我们匹配了所有以前的数字。
  • .*贪婪地匹配任何字符,直到字符串结束。