PowerShell - 从多个文件名中删除特定字符串

6
我有多个目录中的 .mp3 文件,想要从它们的文件名中删除艺术家的名称。 所有文件的名称都包含字符串

"Adhesive Wombat - "

后跟歌曲的标题。 我想在当前文件夹中的每个文件名中删除(而不是替换)该特定字符串的每个出现。

更不用说,我已经在这个网站上搜索答案,但没有找到一个优雅且令人满意的解决方案。

这是我第一次接触 PowerShell。


1
请给我们展示你目前尝试过的代码。 - CB.
SO不是一个代码编写服务。我们期望你能展示一点努力,特别是对于那些被认为是有很好文档记录的请求。请付出一些研究的努力,如果你还是卡住了,那么更新你的问题,我们将非常乐意帮助你。你正在寻找Get-ChildItemRename-Item... 或许你需要使用 For-EachObject - Matt
以下代码有效:Dir | ren -NewName { $_.Name -replace "Adhesive Wombat - ", "" },但也有文件名中没有空格的情况,即"AdhesiveWombat"。我希望能够用一行清晰的代码同时删除这两种字符串,而不是分别执行两个命令。 - Indrasil
Dir | ren -NewName { $_.Name -replace "Adhesive ?Wombat - ", "" } - CB.
@CB。这就是我会回答的。你也可以这样做,并添加一个小解释来结束这个问题。 - Matt
@matt 请做这件事! ;) - CB.
2个回答

17

正如你所知道的,你拥有的东西是非常接近的。

Dir | ren -NewName { $_.Name -replace "Adhesive Wombat - ", "" }

您添加了一个限制条件,即“Adhesive Wombat”可能包含空格。 -replace使用正则表达式,因此让我们利用它,使用? 使该空格可选。我还将向您展示完整的cmdlet名称,而不是别名,以便您了解幕后发生的情况。很难看到,但我试图用粗体突出显示?,使其“突出”。

Get-ChildItem | Rename-Item -NewName {$_.Name -replace "Adhesive ?Wombat - ", "" }

那么这将匹配两个

"other text Adhesive Wombat - other text "
"other text AdhesiveWombat - other text "

此外,根据空白间隙的大小,您可以使用 \s+ 代替空格,这将匹配所有连续的空白字符。

1
不错的“小解释” ;) 向上 - CB.
@CB。我讨厌简短的回答,比如“因为[链接]而起作用”。感觉像是在做不好的服务。 - Matt
@Matt 完美的解决方案。在不到10秒钟的时间内重命名了1210个文件。 - hexacube

3

从以上答案中,下面是一个简单的可复制粘贴的示例,适用于在win 10 Powershell上工作:

  1. 将目录更改为您的目标目录
  2. 使用例如 *.txt 定义文件或设置所有文件使用 *.*
  3. 插入要替换的字符串
cd C:\.... 
Get-ChildItem *.* | Rename-Item -NewName {$_.Name -replace "StringtoReplace", "newString"}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接