string - 如何在指定字符后从多个文件名中删除所有字符 - Powershell
问题描述
如果我解释得不好,请原谅我,我对 PowerShell 很陌生。
我正在尝试清理我的媒体文件,并尝试从具有目录的所有子目录的多个文件中删除指定字符串之后的所有字符。
文件名长度将不一致。但是文件类型会。我还需要排除扩展名被删除。
所以文件看起来像这样:
- 电视剧 S01 E01 剧集标题.mp4
- LongerTVShow S03 E01 剧集标题.mp4
我想删除 E01 之后的所有内容,同时保留 E01
结果:
- 电视剧S01 E01.mp4
- 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 等之后的任何内容。结果如下:
- 电视剧 S01 E04 title_of_show.mp4
- 电视剧 S08 E03Title_of_show.mp4
进入:
- 电视剧S01 E04.mp4
- 电视剧S08 E03.mp4
非常具体,但有人可能会觉得这很有用。
解决方案
您可以执行以下操作:
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+
匹配文字s
或S
和一个或多个 (+
) 数字 (\d
)。在我们的例子中, onlyS
是匹配的,因为我们使用的是-creplace
. 后面的空格\d+
是文字空格。E\d+
匹配文字E
和一个或多个数字。\D
匹配非数字字符。这是必需的,以便后向\d+
不会返回任何数字。它允许我们当前在一个非数字上并且知道我们匹配了所有以前的数字。.*
贪婪地匹配任何字符,直到字符串的结尾。
推荐阅读
- java - 获取 JSON 对象的特定对象(XML 类型)
- yii2 - Yii2 自动更改用户密码
- api - 我的包中的 Swagger-YAML 错误映射条目
- ios - React Native IOS 11.3 - 11.4 错误:JavaScriptCore JSC::JSLock::DropAllLocks::DropAllLocks
- if-statement - IF 语句 - 如何减少/简化源代码量
- objective-c - NSTableView 与 NSArrayController 的竞价不适用于 Storyboard Objective C
- blueprism - Blueprism 进程结束后,显示欢迎程序屏幕
- unity3d - 如何在编辑器模式下突出显示顶点?
- xml - Excel VBA - 如何从 XML URL 获取数据?
- swift - 我有球,想在球进洞时增加分数,但即使在球被移走后,分数也会继续增加