Patrick Skelton Ответов: 1

Как в powershell сортировать каталоги по длине имени каталога?


Я прочитал множество примеров, но, похоже, не могу найти синтаксис для сортировки списка каталогов в PowerShell по длине полного имени каталога.

Вот что у меня есть:

$folderNamePatterns = @( "bin", "obj" )
$deleteFolderList = Get-ChildItem -Path $rootFolder -Recurse -Directory -Include ( $folderNamePatterns ) | Sort-Object -Property DirectoryName.Length
Write-Output "Folder list is:"
for( $i=0; $i -lt $deleteFolderList.Count; $i++ )
{
	Write-Output $deleteFolderList[ $i ].FullName
}


Он не выдает ошибок, но и не сортирует список.

Должно быть, я упускаю что-то удручающе простое. Может ли кто-нибудь сказать мне, что именно?

Добрые пожелания ~ Патрик

Что я уже пробовал:

Я перепробовал все виды аргументов в пользу собственности.

1 Ответов

Рейтинг:
11

Richard Deeming

Досадно, что DirectoryName свойство, кажется, не работает, когда вы сортируете результаты. Не Parent собственность.

Вам, вероятно, придется использовать Select-Object добавление вычисляемого свойства в список:

$deleteFolderList = Get-ChildItem -Path $rootFolder -Recurse -Directory -Include ( $folderNamePatterns ) | Select-Object FullName, @{n='l';e={$_.Parent.FullName.Length}} | Sort-Object -Property l

Совет недели по Windows PowerShell | Microsoft Docs[^]


Patrick Skelton

- Спасибо, Ричард. Я кое-чему научился, но это, кажется, не совсем работает для меня. Ниже я показал упрощенную версию вашего кода вместе с его выводом. Как вы можете видеть, он, кажется, "отрубает" конечный подкаталог при отображении длины.

ПС C:\WINDOWS\system32> Get-ChildItem -Recurse -Directory C:\Temp\Debug | Select-полное имя объекта, @{n='l';e={$_.Parent.Полное имя.Длина}} | Sort-Object -Property
л

Полное имя l
-------- -
C:\Temp\Debug\x64 13.
C:\Temp\Debug\x86 13.
C:\Temp\Debug\Resources 13.
C:\Temp\Debug\WorkingFolders 13.
C:\Temp\Debug\Resources\Graphics 23
C:\Temp\Debug\WorkingFolders\Temp 28.
C:\Temp\Debug\WorkingFolders\Reports 28.
C:\Temp\Debug\WorkingFolders\Logs 28.

Richard Deeming

Итак, вы хотите сортировать по длине полного имени, а не по длине полного имени родительского каталога?

... | Select-Object FullName, @{n='l';e={$_.FullName.Length}} | ...

Richard Deeming

Или, проще говоря:

$deleteFolderList = Get-ChildItem -Path $rootFolder -Recurse -Directory -Include ( $folderNamePatterns ) | Sort-Object @{Expression={$_.FullName.Length}}

Patrick Skelton

Вишневый выбор ваших ответов, это, кажется, делает то, что я хочу: Get-ChildItem-Path C:\Temp -Recurse | Select-полное имя объекта, @{n='l';e={$_.FullName.Длина}} | Sort-Object -Property l