Сортировка PowerShell отлично работает на некоторых машинах, но не на других

#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
  

Я могу получить отсортированные выходные данные на своем рабочем столе, но почему-то тот же код не выдает мне отсортированные выходные данные на моем ноутбуке (как показано ниже для вывода на моем ноутбуке).

PSSortedOutput

Кто-нибудь знает, почему это может происходить? Или есть что-то, что я должен изменить в самом коде.

Спасибо.

Комментарии:

1. Вместо публикации изображения вам следовало просто скопировать выходные данные в свой вопрос.

Ответ №1:

Эта строка:

 $sizeGB="{0:N4}" -f ($subFolderItems.sum/1GB)
  

преобразует ($subFolderItems.sum/1GB) в строку и сохраняет ее в переменной с именем «sizeGB».

Затем в этой строке:

 Sort-Object 'Size(GB)' -Descending
  

Вы сортируете эту строку в порядке убывания. Итак, вы выполняете лексическую сортировку (иначе говоря, алфавитный порядок) строк чисел. Если вы посмотрите на свои результаты, вы увидите, что они отсортированы в алфавитном порядке по убыванию (например, строка, начинающаяся с ‘6’, предшествует строке, начинающейся с ‘5’, которая предшествует строке, начинающейся с ‘4’ и т.д.).

Поэтому не преобразовывайте ваши числа в строки преждевременно в целях форматирования. Форматирование объектов, возвращаемых вашей функцией, в любом случае противоречит идее PowerShell. Вы хотите иметь дело с объектами полностью, от начала до конца. Конечным потребителем должен быть тот, кто решает, как следует форматировать выходные данные.

Комментарии:

1. Я вижу! Я не знал, что это изменило его на строку. Наконец-то это имеет смысл. Прошу прощения, это, должно быть, была очень простая проблема. Ценю помощь!