最近,我一直在尝试使用 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 或更高版本