#powershell #sorting
#powershell #сортировка
Вопрос:
Я не очень хорошо разбираюсь в PowerShell и пытался отсортировать выходные данные для приведенного ниже кода:
function Get-DirSize ($path) {
BEGIN {}
PROCESS{
$colItems = Get-ChildItem $path | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
foreach ($folder in $colItems)
{
$object = New-Object -TypeName PSObject
$subFolderItems = Get-ChildItem $folder.FullName -recurse -force -ErrorAction SilentlyContinue | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
$sizeGB="{0:N4}" -f ($subFolderItems.sum/1GB)
$object | Add-Member -MemberType NoteProperty -Name "Folder" -Value $folder.FullName
$object | Add-Member -MemberType NoteProperty -Name "Size(GB)" -Value $sizeGB
$object
}
}
END {}
}
Get-DirSize -path 'C:' |
Sort-Object 'Size(GB)' -Descending
Я могу получить отсортированные выходные данные на своем рабочем столе, но почему-то тот же код не выдает мне отсортированные выходные данные на моем ноутбуке (как показано ниже для вывода на моем ноутбуке).
Кто-нибудь знает, почему это может происходить? Или есть что-то, что я должен изменить в самом коде.
Спасибо.
Комментарии:
1. Вместо публикации изображения вам следовало просто скопировать выходные данные в свой вопрос.
Ответ №1:
Эта строка:
$sizeGB="{0:N4}" -f ($subFolderItems.sum/1GB)
преобразует ($subFolderItems.sum/1GB)
в строку и сохраняет ее в переменной с именем «sizeGB».
Затем в этой строке:
Sort-Object 'Size(GB)' -Descending
Вы сортируете эту строку в порядке убывания. Итак, вы выполняете лексическую сортировку (иначе говоря, алфавитный порядок) строк чисел. Если вы посмотрите на свои результаты, вы увидите, что они отсортированы в алфавитном порядке по убыванию (например, строка, начинающаяся с ‘6’, предшествует строке, начинающейся с ‘5’, которая предшествует строке, начинающейся с ‘4’ и т.д.).
Поэтому не преобразовывайте ваши числа в строки преждевременно в целях форматирования. Форматирование объектов, возвращаемых вашей функцией, в любом случае противоречит идее PowerShell. Вы хотите иметь дело с объектами полностью, от начала до конца. Конечным потребителем должен быть тот, кто решает, как следует форматировать выходные данные.
Комментарии:
1. Я вижу! Я не знал, что это изменило его на строку. Наконец-то это имеет смысл. Прошу прощения, это, должно быть, была очень простая проблема. Ценю помощь!