对自定义对象列进行排序

对自定义对象列进行排序

最近,我一直在尝试使用 PowerShell 中的自定义对象。我逐渐掌握了其中的窍门,但我不明白为什么 PowerShell 会以看似随机的顺序显示我的对象。例如

$i = 0; $a = @()
$Disks = Get-WMIObject -Class Win32_LogicalDisk

ForEach($Disk in $Disks){

    $props = @{'Disk' = $Disks.DeviceID[$i];
    'Size GB' = "{0:F1}" -f ($Disks.size[$i] / 1GB)}
    $a += New-Object psobject -Property $props
    $i++

}

$a

输出显示为“Size GB”然后是“Disk”。我想要“Disk”然后是“Size GB”。示例 2:

$Computers = 'Server1', 'Server2', 'Server3'
$ComputerInfo = 1..$Computers.Length
$props = @{NAME = ""; MAC_ADDR = ""; IP_ADDR = "" }
$Cred = Get-Credential -Message "Enter Credentials"
$i=0

#Gather requested information for each $computer in $computers
ForEach ($Computer in $Computers) {

    Write-Host "Gathering information on $computer..."
    $ComputerInfo[$i] = New-Object psobject -property $props

    Try {
        $wmiquery = get-wmiobject win32_networkadapterconfiguration -computer $Computer -filter "IPEnabled='True'" -Credential $Cred -ErrorAction SilentlyContinue
        $ComputerInfo[$i].NAME = $computer
        $ComputerInfo[$i].MAC_ADDR = $wmiquery.MACAddress
         $ComputerInfo[$i].IP_ADDR = $wmiquery.IPAddress[0]
    } Catch {
         Write-Host "Unable to query: $computer"
    }

    $i++
}

#Display information
$ComputerInfo

输出显示为“MAC_ADDR”,然后是“IP_ADDR”,然后是“NAME”。我想要的是“NAME”,然后是“MAC_ADDR”,然后是“IP_ADDR”。

答案1

您在以上脚本中使用的创建自定义对象的方法没有对它们进行排序的方法。要按预定义的顺序返回结果,您必须更改自定义对象的创建方式。

$Disks = Get-WMIObject -Class Win32_LogicalDisk

$arr = @()
$Disks | ForEach-Object{
    $obj = New-Object -TypeName PSObject
    $obj | Add-Member -MemberType NoteProperty -Name Disk -Value $_.DeviceID
    $obj | Add-Member -MemberType NoteProperty -Name "Size GB" -Value $([math]::truncate($_.Size / 1GB))
    $arr += $obj
}

Write-Output $arr

上述操作将始终按照添加的顺序返回对象属性,在本例中依次为“磁盘”和“大小 (GB)”。

有关使用自定义对象的更多信息,请参见这里

答案2

哈希表中的条目$props不一定按照您定义它们的顺序存储:

PS C:\> $Props = @{ Disk=123; Size=10240 }
PS C:\> $Props

Name                           Value
----                           -----
Size                           10240
Disk                           123

为了保持顺序,使用[ordered]类型加速器来创建有序字典反而:

PS C:\> $Props = [ordered]@{ Disk=123; Size=10240 }
PS C:\> New-Object psobject -Property $Props

Disk  Size
----  ----
 123 10240

适用于 PowerShell 3.0 或更高版本

相关内容