Сортировка столбцов пользовательского объекта

В последнее время я играл вокруг с пользовательскими объектами в 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'.

0
задан 11 September 2015 в 00:08
2 ответа

Метод создания пользовательских объектов, который вы используете в вышеприведенном скрипте, не имеет метода для их сортировки. Для того, чтобы результаты возвращались в предопределённом порядке, необходимо изменить способ создания пользовательского объекта.

$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

Свойства объекта всегда будут возвращаться в том порядке, в котором они были добавлены, в данном случае Диск, затем Размер ГБ.

Подробнее о работе с пользовательским объектом можно узнать по ссылке здесь.

.
1
ответ дан 4 December 2019 в 12:26

Записи в вашем $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 или более новой версии

.
2
ответ дан 4 December 2019 в 12:26

Теги

Похожие вопросы