Откройте 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\*\*\
.