Добавьте начальный ноль к именам файлов с помощью PowerShell

У меня есть папка, содержащая несколько сотен .mp3-файлов, все с одинаковым именем и возрастающим номером. Имена файлов выглядят так:

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

Как видите, количество ведущих нулей в первых файлах неверное, так как их должно быть на один больше. Я хотел бы использовать PowerShell для решения проблемы, поскольку в настоящее время я учусь работать с этим весьма полезным инструментом.

Я попытался подсчитать цифры в именах файлов с помощью оператора замены, чтобы отфильтровать любые нецифровые символы. Я предположил, что первые 99 файлов будут иметь три цифры, в то время как другие файлы будут иметь больше (считая «3» расширения файла .mp3)

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

Это должно дать мне любые файлы, которые имеют 3 или меньше цифр в имени файла, но это не так. На самом деле ничего не показывает. Если я увеличу число в конце до 11, я получу первые три тестовых файла, а увеличение до 12 покажет все шесть из них. Я предполагаю, что оператор замены не применяется к имени файла до фильтрации на основе оператора длины, хотя я использовал скобки вокруг $_.Name.Replace(\D,)

Что, черт возьми, я делаю неправильно?


person Adamantium23    schedule 31.01.2021    source источник


Ответы (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, как показано здесь

person Adamantium23    schedule 31.01.2021
comment
просто для дополнительной детализации оператор формата строки -f тоже может это сделать. у него есть параметр числового формата, который позволит вам заполнить число любым количеством цифр. - person Lee_Dailey; 31.01.2021

Заменив "Test " на "Test 0", вы все равно не добьетесь того, чего хотите, для файлов с номерами Test 1.mp3 (поскольку это станет Test 01.mp3, что означает один начальный ноль).

Вы можете убедиться, что все файлы будут иметь трехзначный порядковый номер, выполнив следующие действия:

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.

person Theo    schedule 01.02.2021