Powershell 文件重命名以删除特定位置或字符之前的多个字符

问题描述 投票:0回答:2

我有近 8,000 个文件的文件/路径名对于 Windows 来说太长。我需要保留文件夹结构,所以我需要缩短文件名。

文件名示例:

File description that is waaay too long for Windows ABCD [General_123].doc
File description that is waaay too long for Windows AB123 [General_456].docx
Spreadsheet for Year 2023 with a too long name [General_159].xls

所有文件名都以 [General_xxx] 结尾,并不总是位于文件名开头的相同位置。我想从文件名末尾删除大约 20 个字符,同时保留 [General_xxx] 和文件扩展名。是的,文件名使用方括号 []。

我从这个脚本开始,但无法找到一种方法来从我需要删除的位置删除字符。

Get-ChildItem | rename-item -newname { $_.name.substring(0,$_.name.length-20) + $_.Extension }

powershell file-rename
2个回答
1
投票

以下正则表达式模式可能会执行您想要的操作,如果字符串 has 20 个字符 before

[....]
,那么它将删除这 20 个字符:

@'
File description that is waaay too long for Windows ABCD [General_123].doc
File description that is waaay too long for Windows AB123 [General_456].docx
Spreadsheet for Year 2023 with a too long name [General_159].xls
'@ -split '\r?\n' |
    Where-Object { $_ -match '.{20}(?=\[.+?\])' } |
    ForEach-Object { $_.Replace($Matches[0], '') }

# Outputs:

# File description that is waaay too lo[General_123].doc
# File description that is waaay too lon[General_456].docx
# Spreadsheet for Year 2023 w[General_159].xls

如果您认为这适用于您的用例,则应用于

Rename-Item
逻辑:

Get-ChildItem -File |
    Where-Object Name -match '.{20}(?=\[.+?\])' |
    Rename-Item -NewName { $_.Name.Replace($Matches[0], '') }

有关正则表达式模式的详细信息,您可以查看:https://regex101.com/r/Gqqq4t/1


0
投票

这将获取文件,获取文件名在

[General_*]
模式之前的第一部分,删除最后 20 个字符,然后重新添加
[General_*]
字符串和扩展名。

Get-ChildItem | Rename-Item -NewName { $split = $_.basename -split '(?=\[General_.+\])' ; $split[0].substring(0, ($split[0].length - 20)) + $split[1] + $_.extension }
© www.soinside.com 2019 - 2024. All rights reserved.