Как я могу контролировать порядок обработки элементов в / из get-childitem -recurse - PullRequest
3 голосов
/ 02 марта 2012

Попытка самообразования: при обработке целого дерева предметов из

get-childitem -recurse

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

Чтобы обойти это, я прибегнул к сортировке всей коллекции по количеству разделителей в путях, чтобы сначала получить уровень листа, а затем верхние уровни дерева:

$someFiles = Get-ChildItem -Recurse | Sort @{Expression={ ( $_.fullname | select-string "\\" -AllMatches ).matches.count }; Descending=$true }

Это кажется неправильным - у меня ограниченный опыт кодирования, но я знаю, что, если я просто перейду дерево правильным способом, эта дорогая и глупая сортировка не понадобится. Но -ресурс такой удобный!

Какой самый умный способ сделать это? Если быть точным, есть ли способ пройти по дереву с помощью get-childitem, от листа вверх, который не требует сортировки всех результатов?

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Вы можете избежать регулярного выражения и просто использовать метод разделения строк. Он также работает лучше.

dir -recurse | sort -Property @{ Expression = {$_.FullName.Split('\').Count} } -Desc

Результат:

TotalMilliseconds : 346.1253

против ...

Get-ChildItem -Recurse | Sort @{Expression={ ( $_.fullname | select-string "\\" -AllMatches ).matches.count }; Descending=$true }

Результат:

TotalMilliseconds : 953.6606
2 голосов
/ 02 марта 2012

Я просто использую длину полного имени:

gci -recurse | sort @{expression = {$_.fullname.length}} -descending

Все дочерние элементы будут отсортированы до родительского контейнера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...