提问人:Harry Pen 提问时间:11/8/2023 最后编辑:mklement0Harry Pen 更新时间:11/9/2023 访问量:55
如何重命名多个保留括号的文件 - Powershell
How to rename multiple files keeping brackets - Powershell
问:
我正在尝试删除 [*] 中内容之前的任何单词
我有多个文件要重命名,例如“ABC [1].txt、ABC [2].txt、ABC [3].txt”,我需要重命名为“[1].txt、[2].txt、[3].txt”
我有几百个项目要重命名,想知道这是否可以在 powershell 中完成。
但是,我找不到有关执行此操作的任何信息。有人有什么想法吗?谢谢!
答:
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
- 是上面捕获的替换字符串。
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$)'
- 有关正则表达式及其试验选项的说明,请参阅此 regex101.com 页。
或者 - 演示分别处理基本文件名及其扩展名:
($_.BaseName -replace '^.+ (?=\[\d+\]$)') + $_.Extension
与正则表达式不匹配的输入文件名会导致按原样返回输入字符串,这反过来又会导致悄悄地跳过此类文件(尝试将文件重命名为其现有名称是一种安静的不操作)。
-replace
New-Item
- 但是,请注意,从 PowerShell 7.4.0 开始,这仅适用于文件,而不适用于重命名目录,其中尝试重命名为现有名称会导致错误。
- 将目录与文件视为相同(如果新名称与旧名称相同,则安静无操作)是 GitHub 问题 #14903 的主题,该问题已获得批准,但还没有人加紧实施它。
评论