regex 使用PowerShell向文件名添加前导零

0mkxixxg  于 2023-06-07  发布在  Shell
关注(0)|答案(3)|浏览(400)

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

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

正如您所看到的,第一个文件中前导零的数量是错误的,因为它们应该多一个。我想使用PowerShell来解决这个问题,因为我目前正在学习操作这个非常有用的工具。
我尝试使用Replace运算符来计算文件名中的数字,以过滤掉任何非数字字符。我假设前99个文件将有三个数字,而其他文件将有更多(计算.mp3文件扩展名的“3”)
Get-Childitem | Where {($_.Name.Replace("\D","")).Length -le 3}
这应该会给予我任何文件名中有3个或更少数字的文件-但它没有。事实上,它显示没有。如果我将末尾的数字增加到11,我将得到前三个测试文件,将其增加到12将显示所有六个文件。我假设在基于长度运算符的过滤之前,Replace-Operator不会应用于文件名,尽管我在$_.Name.Replace(“\D”,””)周围使用了方括号
我到底做错了什么?

41ik7eoe

41ik7eoe1#

我想出来了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"}
也可以将所有文件重命名为仅包含数字的scheamtic,并使用padleft命令,如here所示

rslzwgfq

rslzwgfq2#

通过将"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

zlhcx6iw

zlhcx6iw3#

如果你知道这个数字应该表示多长,你可以使用ToString将一个int转换成一个 n 位长的string(可能有前导0)。例如,要有一个3位数长的数字,您可以使用.ToString('000')
所以对于这个问题:

Get-ChildItem | ForEach-Object { $_.BaseName -match '\d+' | Out-Null; $digits = $Matches[0]; Rename-Item $_ ($_.Name -replace $digits, ([int]$digits).ToString('000')) }

(The Out-Null用于防止显示-match输出。)

相关问题