sorting自定义对象列

最近,我一直在使用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 

输出显示为'尺寸GB',然后'磁盘'。 我想'磁盘',然后'尺寸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”。 我想'名字',然后'MAC_ADDR',然后'IP_ADDR'。

在上面的脚本中创build自定义对象的方法没有方法对它们进行sorting。 要以预定义顺序返回结果,必须更改自定义对象的生成方式。

 $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 

以上将始终按照添加的顺序返回对象属性,在这种情况下,请selectDisk然后selectSize GB。

更多关于使用自定义对象的信息可以在这里find。

您的$props散列表中的条目不一定按您定义的顺序存储:

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

要维护顺序,请使用[ordered]types的加速器来创build一个有序的字典 :

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

适用于PowerShell 3.0或更高版本