如何重命名多个保留括号的文件 - Powershell

How to rename multiple files keeping brackets - Powershell

提问人:Harry Pen 提问时间:11/8/2023 最后编辑:mklement0Harry Pen 更新时间:11/9/2023 访问量:55

问:

我正在尝试删除 [*] 中内容之前的任何单词

我有多个文件要重命名,例如“ABC [1].txt、ABC [2].txt、ABC [3].txt”,我需要重命名为“[1].txt、[2].txt、[3].txt”

我有几百个项目要重命名,想知道这是否可以在 powershell 中完成。

但是,我找不到有关执行此操作的任何信息。有人有什么想法吗?谢谢!

PowerShell 文件 重命名项 cmdlet

评论


答:

1赞 mandy8055 11/8/2023 #1

这可以通过简单的正则表达式替换来实现:

$sourceFolder = "C:\path\to\your\dir"

Get-ChildItem -Path $sourceFolder -Filter "*[*" | ForEach-Object {
    $newName = $_.Name -replace '.*(\[\d+\].*)', '$1'
    Rename-Item -Path $_.FullName -NewName $newName
}

所用正则表达式的解释:

  • .* - 匹配任何字符的 0 个或多个。
  • (\[\d+\].*) - 捕获组捕获 1 个或多个数字,这些数字用 ext-name 括起来。[]
  • $1 - 是上面捕获的替换字符串。

image

0赞 mklement0 11/8/2023 #2

Rename-Item延迟绑定脚本块一起使用,在该块中,您可以根据每个给定文件的现有名称 () 动态确定其新名称并输出新名称。$_.Name

在您的情况下,基于正则表达式的 -replace 运算符允许您从文件名中删除 (last) 之前的所有内容:[

Get-ChildItem *.txt |
  Rename-Item -NewName { $_.Name -replace '^.+ (?=\[)' } -WhatIf 

注意:上述命令中的 -WhatIf 通用参数预览操作。删除 -WhatIf 并在确定操作将执行所需操作后重新执行。

注意:

  • 上述情况可能会导致目标文件名重复,处理这种情况需要额外的工作。

  • 不指定替换操作数 with 与指定空字符串相同,后者有效地删除了匹配的内容。-replace

    • 例如,与 : 两者都导致'foo' -replace 'o''foo' -replace 'o', '''f'
  • 如果需要,您可以使正则表达式更加健壮;例如:

    • $_.Name -replace '^.+ (?=\[\d+\]\.txt$)'

    • 或者 - 演示分别处理基本文件名及其扩展名

      • ($_.BaseName -replace '^.+ (?=\[\d+\]$)') + $_.Extension
  • 与正则表达式不匹配的输入文件名会导致按原样返回输入字符串,这反过来又会导致悄悄地跳过此类文件(尝试将文件重命名为其现有名称是一种安静的不操作)。-replaceNew-Item

    • 但是,请注意,从 PowerShell 7.4.0 开始,这仅适用于文件,而不适用于重命名目录,其中尝试重命名为现有名称会导致错误
    • 将目录与文件视为相同(如果新名称与旧名称相同,则安静无操作)是 GitHub 问题 #14903 的主题,该问题已获得批准,但还没有人加紧实施它。