В последнее время я играл вокруг с пользовательскими объектами в 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
Вывод показывается 'Размером ГБ' затем 'Диск'. Я хочу 'Диск' затем 'Размер ГБ'. Пример 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' затем 'НАЗЫВАЮТ'. Я хочу 'ИМЯ' затем 'MAC_ADDR' затем 'IP_ADDR'.
Метод создания пользовательских объектов, который вы используете в вышеприведенном скрипте, не имеет метода для их сортировки. Для того, чтобы результаты возвращались в предопределённом порядке, необходимо изменить способ создания пользовательского объекта.
$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
Свойства объекта всегда будут возвращаться в том порядке, в котором они были добавлены, в данном случае Диск, затем Размер ГБ.
Подробнее о работе с пользовательским объектом можно узнать по ссылке здесь.
. Записи в вашем $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 или более новой версии
.