PowerShell sort在某些机器上可以正常运行,但在其他机器上则不能

时间:2019-03-05 05:51:03

标签: powershell sorting

我不熟悉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 个答案:

答案 0 :(得分:2)

此行:

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

($subFolderItems.sum/1GB)转换为字符串并将其存储在名为“ sizeGB”的变量中。

然后在此行:

Sort-Object 'Size(GB)' -Descending

您正在按降序对该字符串排序。因此,您正在对数字字符串执行词汇排序(又称字母顺序)。如果查看结果,您会发现它们按字母顺序降序排列(例如,以'6'开头的字符串在以'5'开头的字符串之前,以'4'开头的字符串等等)。

因此,请勿出于格式化目的将您的数字过早地转换为字符串。无论如何,格式化从函数返回的对象都与PowerShell的想法相反。您想要从头到尾一直处理对象。最终使用者应该是决定如何格式化输出的使用者。