如何从填充的第一个数字开始在 PowerShell 中批量重命名文件
How to batch rename files in PowerShell starting with padded first numbers
我是PowerShell
新手所以请多多关照!我想批量重命名一组文件,然后填充第一位数字,以便它们在我的设备上按顺序播放。
例如,我有一个装满 mp3 ABCDEF_S3L1_010221_GHIJK.mp3
到 ABCDEF_S3L49_210921_GHIJK.mp3
的文件夹
我正在尝试将它们重命名为 01-lesson.mp3
到 49-lesson.mp3
其中 L
之后的数字 是前缀 但我绊倒了加上课程 1-9
的填充,所以它们会乱序播放,即 01
然后是 10
、11
、12
等。我试过使用变体.PadLeft
和 {0:D2}
但不断出现错误,例如:
Rename-Item: The filename, directory name, or volume label syntax is incorrect.
我的代码在没有初始填充的情况下工作:
PS G:\Temp\MP3s> Get-ChildItem -Path *.mp3 | Rename-Item
-NewName {$_.Name -replace '(^ABCDEF_S3L)(\d{1,2})_(\d{6})_(GHIJK)', '-lesson'}`
您可以使用 -match
并通过这样做捕获 $matches[1]
中 L
后面的数字,可以按照您想要的格式设置:
Get-ChildItem -Path 'D:\Test' -Filter '*.mp3' -File |
# apply better filename filter and capture the number after the 'L' in $matches[1]
Where-Object { $_.BaseName -match '^\w+_S\dL(\d+)_\d+_\w+' } |
Rename-Item -NewName { ('{0:D2}-lesson{1}' -f [int]$matches[1], $_.Extension) }
作弊并使用脚本块替换进入 powershell 7。您只需要在第 2 组比赛位于 $_
比赛对象内进行锻炼,结果是 $_.groups[2].value
。然后就可以用.padleft(2,'0')
了。
# echo hi | set-content ABCDEF_S3L1_010221_GHIJK.mp3,
# ABCDEF_S3L49_210921_GHIJK.mp3
Get-ChildItem -Path *.mp3 |
% { $_.Name -replace '(^ABCDEF_S3L)(\d{1,2})_(\d{6})_(GHIJK)',
{ $a = $_ } }
.mp3
.mp3
$a
Groups : {0, 1, 2, 3, 4}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 25
Value : ABCDEF_S3L49_210921_GHIJK
Get-ChildItem -Path *.mp3 |
rename-item -newname {
$_.Name -replace '(^ABCDEF_S3L)(\d{1,2})_(\d{6})_(GHIJK)',
{ $_.groups[2].value.padleft(2,'0') + '-lesson' } } -whatif
What if: Performing the operation "Rename File" on target
"Item: C:\Users\js\foo\ABCDEF_S3L1_010221_GHIJK.mp3
Destination: C:\Users\js\foo-lesson.mp3".
What if: Performing the operation "Rename File" on target
"Item: C:\Users\js\foo\ABCDEF_S3L49_210921_GHIJK.mp3
Destination: C:\Users\js\foo-lesson.mp3".
我是PowerShell
新手所以请多多关照!我想批量重命名一组文件,然后填充第一位数字,以便它们在我的设备上按顺序播放。
例如,我有一个装满 mp3 ABCDEF_S3L1_010221_GHIJK.mp3
到 ABCDEF_S3L49_210921_GHIJK.mp3
我正在尝试将它们重命名为 01-lesson.mp3
到 49-lesson.mp3
其中 L
之后的数字 是前缀 但我绊倒了加上课程 1-9
的填充,所以它们会乱序播放,即 01
然后是 10
、11
、12
等。我试过使用变体.PadLeft
和 {0:D2}
但不断出现错误,例如:
Rename-Item: The filename, directory name, or volume label syntax is incorrect.
我的代码在没有初始填充的情况下工作:
PS G:\Temp\MP3s> Get-ChildItem -Path *.mp3 | Rename-Item
-NewName {$_.Name -replace '(^ABCDEF_S3L)(\d{1,2})_(\d{6})_(GHIJK)', '-lesson'}`
您可以使用 -match
并通过这样做捕获 $matches[1]
中 L
后面的数字,可以按照您想要的格式设置:
Get-ChildItem -Path 'D:\Test' -Filter '*.mp3' -File |
# apply better filename filter and capture the number after the 'L' in $matches[1]
Where-Object { $_.BaseName -match '^\w+_S\dL(\d+)_\d+_\w+' } |
Rename-Item -NewName { ('{0:D2}-lesson{1}' -f [int]$matches[1], $_.Extension) }
作弊并使用脚本块替换进入 powershell 7。您只需要在第 2 组比赛位于 $_
比赛对象内进行锻炼,结果是 $_.groups[2].value
。然后就可以用.padleft(2,'0')
了。
# echo hi | set-content ABCDEF_S3L1_010221_GHIJK.mp3,
# ABCDEF_S3L49_210921_GHIJK.mp3
Get-ChildItem -Path *.mp3 |
% { $_.Name -replace '(^ABCDEF_S3L)(\d{1,2})_(\d{6})_(GHIJK)',
{ $a = $_ } }
.mp3
.mp3
$a
Groups : {0, 1, 2, 3, 4}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 25
Value : ABCDEF_S3L49_210921_GHIJK
Get-ChildItem -Path *.mp3 |
rename-item -newname {
$_.Name -replace '(^ABCDEF_S3L)(\d{1,2})_(\d{6})_(GHIJK)',
{ $_.groups[2].value.padleft(2,'0') + '-lesson' } } -whatif
What if: Performing the operation "Rename File" on target
"Item: C:\Users\js\foo\ABCDEF_S3L1_010221_GHIJK.mp3
Destination: C:\Users\js\foo-lesson.mp3".
What if: Performing the operation "Rename File" on target
"Item: C:\Users\js\foo\ABCDEF_S3L49_210921_GHIJK.mp3
Destination: C:\Users\js\foo-lesson.mp3".