1

Так что у меня в папке с музыкой сотни "альбомов" с одним музыкальным файлом.

Мне это не нравится, я хочу только полные альбомы в этой папке.

Есть ли простое решение для этого? По сути, инструмент, который удаляет все папки с одним файлом? Я использую Windows 7

2 ответа2

1

Откройте PowerShell ISE и попробуйте запустить это:

$targets = @()
$folders = dir "D:\Users\Forza\Music\" | Where {$_.mode -match "d"}
foreach ($folder in $folders) {
     if(
        ($folder.GetFiles() |
         Measure-Object |
         Select -ExpandProperty Count) -eq 1) 
        {$targets += $folder}
}
$targets | Format-Table -Property Name

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

foreach ($target in $targets){Remove-Item -Recurse -Force $target.FullName}

Это удалит все папки, которые были перечислены в $targets .

Если вам нужно изменить этот скрипт, он поможет понять, что он делает. Например, как-бы вы удалили все папки с подпапками, но без файлов в первом каталоге. Так что если у вас есть что-то вроде C:\Users\Forza\Music\SomeArtist\SomeAlbum , весь каталог SomeArtist будет удален. Также все пустые папки останутся.

Пойдем построчно:

  1. $targets = @() определяет массив. Это делается для того, чтобы мы могли добавить $folder s к $targets без выдачи ошибки и убедиться, что $targets начинается с нуля, вместо того, чтобы постоянно добавлять его во время изменения нашего сценария и в конечном итоге удалять гораздо больше папок, чем мы планировали.
  2. $folders = dir 'C:\Users\Forza\Music\' | Where {$_.mode -match "d"} перечисляет содержимое указанного каталога и каналы, которые выводятся в команду Where-Object . $_.mode -match "d" берет переданные по конвейеру объекты и проверяет, что они являются каталогами.
  3. foreach ($folder in $folders) { начать цикл по каждой папке
  4. if( начинает оператор if для проверки количества файлов в папке. Я разделить каждую строку , чтобы сделать его запутанным для чтения.
  5. $folder.GetFiles() | это захватывает все файлы в папке, которую мы проверяем. Обратите внимание на канал, который отправляет вывод следующей команде на следующей строке.
  6. Measure-Object | это довольно понятно Если нет, попробуйте команду Get-Help Measure-Object .
  7. Select -ExpandProperty Count) -eq 1) выбирает и расширяет свойство Count чтобы мы могли видеть, равно ли оно (-eq) 1. Обратите внимание на две закрывающие скобки, одну для закрытия ($folder.GetFiles() | Measure-Object | Select -ExpandProperty Count) и один, чтобы закрыть оператор if .
  8. {$targets += $folder} добавляет нашу папку, соответствующую критериям, в наш список $targets .
  9. } закрывает цикл foreach.
  10. $targets | Format-Table -Property Name выводит список папок для удаления.

Если вы хотите изменить это, чтобы удалить пустые папки, просто измените -eq 1 на -lt 2 . Приложив немного творческого подхода, вы сможете получить скрипт, который будет обрабатывать вашу грязную файловую структуру, какой вы считаете нужным.


Чтобы позаботиться о папке «Художники» в папке \Music, измените путь на что-то вроде C:\Users\Forza\Music\*\*\ .

1

Это сделало это для меня:

ls I:\temp | ?{$_.PSIsContainer} | ?{(ls $_.FullName | ?{-NOT $_.PSIsContainer}).Count -eq 1} | %{Remove-Item $_.FullName -WhatIf}

Удалите -Что делать это по-настоящему. Обратите внимание, что он удалит папку с одним файлом, даже если в нем есть подпапки с большим количеством файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .