首页 > 解决方案 > 如何在指定字符后从多个文件名中删除所有字符 - Powershell

问题描述

如果我解释得不好,请原谅我,我对 PowerShell 很陌生。

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

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

所以文件看起来像这样:

  1. 电视剧 S01 E01 剧集标题.mp4
  2. LongerTVShow S03 E01 剧集标题.mp4

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

结果:

  1. 电视剧S01 E01.mp4
  2. LongerTVShow S03 E01.mp4

我目前还有其他几行正在清除我指定的字符,例如查找句点并用空格替换它们:

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

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

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

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

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

感谢您的任何回答!


编辑

我使用了 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. 电视剧 S08 E03Title_of_show.mp4

进入:

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

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

标签: stringpowershellreplacetrim

解决方案


您可以执行以下操作:

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)。在我们的例子中, onlyS是匹配的,因为我们使用的是-creplace. 后面的空格\d+是文字空格。
  • E\d+匹配文字E和一个或多个数字。
  • \D匹配非数字字符。这是必需的,以便后向\d+不会返回任何数字。它允许我们当前在一个非数字上并且知道我们匹配了所有以前的数字。
  • .*贪婪地匹配任何字符,直到字符串的结尾。

推荐阅读