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