我不熟悉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
我能够在台式机上获得排序的输出,但是不知何故,相同的代码无法在笔记本电脑上为我提供排序的输出(如下所示,我的笔记本电脑的输出)。
有人知道为什么会这样吗?还是我应该对代码本身进行更改?
谢谢。
答案 0 :(得分:2)
此行:
$sizeGB="{0:N4}" -f ($subFolderItems.sum/1GB)
将($subFolderItems.sum/1GB)
转换为字符串并将其存储在名为“ sizeGB”的变量中。
然后在此行:
Sort-Object 'Size(GB)' -Descending
您正在按降序对该字符串排序。因此,您正在对数字字符串执行词汇排序(又称字母顺序)。如果查看结果,您会发现它们按字母顺序降序排列(例如,以'6'开头的字符串在以'5'开头的字符串之前,以'4'开头的字符串等等)。>
因此,请勿出于格式化目的将您的数字过早地转换为字符串。无论如何,格式化从函数返回的对象都与PowerShell的想法相反。您想要从头到尾一直处理对象。最终使用者应该是决定如何格式化输出的使用者。