使用 PowerShell 将前导零添加到文件名

时间:2021-01-31 14:08:23

标签: regex powershell leading-zero

我有一个文件夹,其中包含多个 .mp3 文件,所有文件都具有相同的名称和升序编号。文件名如下所示:

Test 01.mp3
Test 02.mp3
Test 03.mp3
Test 100.mp3
Test 101.mp3
Test 102.mp3

如您所见,第一个文件中前导零的数量是错误的,因为它们应该还有一个。我想使用 PowerShell 来解决这个问题,因为我目前正在学习操作这个非常有用的工具。

我尝试使用替换运算符来计算文件名中的数字以过滤掉任何非数字字符。我假设前 99 个文件有三位数,而其他文件会有更多(计算 .mp3 文件扩展名的“3”)

Get-Childitem | Where {($_.Name.Replace("\D","")).Length -le 3}

这应该给我任何文件名中包含 3 个或更少数字的文件 - 但它没有。事实上,它没有显示。如果我将最后的数字增加到 11,我会得到前三个测试文件,将其增加到 12 显示所有六个。我假设替换运算符不会在基于长度运算符的过滤之前应用于文件名,尽管我在 $_.Name.Replace("\D","") 周围使用了括号

我到底做错了什么?

2 个答案:

答案 0 :(得分:2)

我想通了:Get-ChildItem | Where {($_.Name -replace "\D","").Length -le 3} 返回我需要重命名的文件。 我使用的整个命令是

Get-ChildItem | Where {($_.Name -replace "\D","").Length -le 3} | Rename-Item -NewName { $_.Name -replace "Test ","Test 0"}

也可以将所有文件重命名为仅数字示意图并使用 padleft 命令,如图所示 here

答案 1 :(得分:1)

通过将 "Test " 替换为 "Test 0",您仍然无法在编号为 Test 1.mp3 的文件上实现您想要的效果(因为这将变为 Test 01.mp3,这是一个领先的零短路)。

您可以通过这样做来确保所有文件都有一个 3 位数的序列号:

Get-Childitem -Path 'D:\Test' -Filter '*.mp3' -File | 
    Where-Object {$_.BaseName -match '(\D+)(\d+)$'} | 
    Rename-Item -NewName { '{0}{1:D3}{2}' -f $Matches[1], [int]$Matches[2], $_.Extension }

这样,Test 00000003.mp3 等错误命名的文件也将重命名为 Test 003.mp3