我有一个文件夹,其中包含多个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”,””)周围使用了方括号
我到底做错了什么?
3条答案
按热度按时间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所示
rslzwgfq2#
通过将
"Test "
替换为"Test 0"
,您仍然无法在编号为Test 1.mp3
的文件上实现您想要的效果(因为这将成为Test 01.mp3
,这是一个前导零)。您可以通过执行以下操作来确保所有文件都具有3位数的序列号:
这样,错误命名的文件(如
Test 00000003.mp3
)将被重命名为Test 003.mp3
zlhcx6iw3#
如果你知道这个数字应该表示多长,你可以使用
ToString
将一个int
转换成一个 n 位长的string
(可能有前导0)。例如,要有一个3位数长的数字,您可以使用.ToString('000')
。所以对于这个问题:
(The
Out-Null
用于防止显示-match
输出。)