【问题标题】:Powershell rename files whilst maintaining the original file orderPowershell 重命名文件,同时保持原始文件顺序
【发布时间】:2021-03-13 03:35:27
【问题描述】:
我有一组格式如下的文件
我想将文件名更改为以下格式
我使用了以下代码:
`$i = 21
目录 | ForEach-对象 {$_ |重命名项目 -NewName ('00816-101998-XX-A-2-50-{0:D3} Detalj.{1}' -f $i++, $_.Extension)}`
此代码以文件名 A.10.11.11 开始重命名
如何让它从第一个文件名开始,即 8.A.10.11.8?
谢谢!
【问题讨论】:
标签:
powershell
file
rename
【解决方案1】:
看你的问题,我想这就是你打算做的。
当前文件名列表应按文件名开头的整数值排序。
接下来,您要使用以值 21 开头的计数器重命名它们
为此,您可以使用 ForEach-Object 循环,但 Rename-Item 的 -NewName 参数也可以包含包含要执行的操作的脚本块。
$i = 21
(Get-ChildItem -Path 'D:\Test' -Filter '*.pdf' -File) |
Sort-Object @{Expression = {[int]($_.Name -split ' ')[0]}} |
Rename-Item -NewName { '00816-101998-XX-A-2-50-{0:D3} Detalj{1}' -f $script:i++, $_.Extension }
附:图像显示文件名以数字开头,后跟 空格,而在问题中,您给出了一个示例,其中数字后跟一个点 .。如果您的文件名是这种情况,请将[int]($_.Name -split ' ')[0] 更改为[int]($_.Name -split '\.')[0]
1.我们需要使用$script:i 范围语法来寻址和增加计数器$i 的值,否则NewName 脚本块中不存在$i
2.为避免两次重命名文件,请将代码中的Get-ChildItem部分括在括号之间
【解决方案2】:
param(
$directory = "d:\tmp",
[regex]$rx = "(?<=8.A.10.11.)\d+",
[string]$newPrefix = "00816-101998-XX-A-2-50-"
)
<#
8..20 | ForEach-Object {
$filePath = Join-Path $directory -ChildPath "8.A.10.11.$_.pdf"
Out-File -InputObject "some text" -FilePath $filePath -Encoding default
}
#>
Get-ChildItem $directory | ForEach-Object{
Rename-Item $_.FullName -NewName "$newPrefix$((($rx.Matches($_.BaseName)).value).padleft(3,'0'))$($_.Extension)"
}