PowerShell使用Split方法优化Rename-Item -NewName

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

简而言之,我将硬编码值“USA”插入到文件名的中间。我的代码目前可以工作,但我觉得它可以优化,也许可以通过使用

-replace
运算符和 RegEx 或更少的返回值(第四个分隔符“.”+“USA”之前的所有内容+之后的所有内容)而不是返回 12 个值(0位置 + '.' + 1 位置 + '.' + 2 位置 + '.' + 3 位置 + '.' + '美国' + '.' + 4 位置 + $_.Extension)。或者也许在第四个分隔符之后使用 Insert 方法?我正在迭代一个包含数百个子文件夹的目录,并重命名“2023”子文件夹中的“.xlsx”文件。 “2023”内通常有一个名为“Misc”的文件夹。我不想重命名那些“.xlsx”文件,只想重命名“2023”中的文件。我确信我什至可以收紧这一点,只查找具有 4 个“.”的“.xlsx”文件。在文件名中(不包括文件扩展名或新值“USA”),因此我不会用“.”重命名其他“.xlsx”文件在文件名中。

当前文件命名约定:comp_id.process_id.comp_name.state.date.xlsx

例如:12345.001.chris_comp.NY.2023_08_22.xlsx

所需的文件名命名约定,在第四个分隔符“.”之后插入硬编码值“USA”所以它看起来像这样:comp_id.process_id.comp_name.USA.date.xlsx

例如:12345.001.chris_comp.NY.美国.2023_08_22.xlsx

#renameFile
$numberedFolder = 'C:\Users\Documents\My Documents\PowerShell\Test'
$excludeFolder = 'Misc'
$delimiter = '.'
$excelFile = '.xlsx'
$search = Get-ChildItem -Path $nuberedFolder -Filter '2023' -Recurse
ForEach ($path in $search.fullname) {
Get-ChildItem -Path $path | Where-Object {($_.Extension -match $excelFile)} | 
Rename-Item -NewName {$_.Name.Split($delimiter)[0] + '.' + $_.Name.Split($delimiter)[1] + '.' + $_.Name.Split($delimiter)[2] + '.' + $_.Name.Split($delimiter)[3] + '.' + 'USA' + '.' + $_.Name.Split($delimiter)[4] + $_.Extension} -WhatIf
}
powershell rename file-rename rename-item-cmdlet
1个回答
0
投票

事实上,基于 regex

-replace
运算符提供了一个简洁的解决方案:

... |
 Rename-Item -NewName { $_.Name -replace '(?:[^.]+\.){4}', '$&USA.' } -WhatIf

有关正则表达式和替换表达式的说明以及实验它们的选项,请参阅 此 regex101.com 页面

© www.soinside.com 2019 - 2024. All rights reserved.