我有近 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 }
以下正则表达式模式可能会执行您想要的操作,如果字符串 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。
这将获取文件,获取文件名在
[General_*]
模式之前的第一部分,删除最后 20 个字符,然后重新添加 [General_*]
字符串和扩展名。
Get-ChildItem | Rename-Item -NewName { $split = $_.basename -split '(?=\[General_.+\])' ; $split[0].substring(0, ($split[0].length - 20)) + $split[1] + $_.extension }