2

我是PowerShell新手所以请温柔!我正在寻找批量重命名文件集合,然后填充第一个数字,以便它们在我的设备上按顺序播放。

例如,我有一个完整的 mp3 文件夹,ABCDEF_S3L1_010221_GHIJK.mp3通过ABCDEF_S3L49_210921_GHIJK.mp3

我正在尝试将它们重命名为01-lesson.mp3通过前缀后面49-lesson.mp3的数字,但我因课程的填充而绊倒,因此它们无序播放,即然后,等。我尝试使用变体,但不断得到错误,例如:L1-901101112.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)', '$2-lesson'}`
4

2 回答 2

1

您可以使用-match并通过这样做来捕获 in 后面的数字L$matches[1]可以根据需要对其进行格式化:

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) }
于 2021-09-26T11:01:01.460 回答
0

作弊并使用脚本块替换进入 powershell 7。您只需要锻炼第二组比赛在$_比赛对象内的位置,结果是$_.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\01-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\49-lesson.mp3".
于 2021-09-26T13:47:56.547 回答