Объединение результатов переменных в хеш-таблицу и отображение всех значений

Мои коды ниже собирают время загрузки, характеристики сервера, диски и т. д. и сохраняют их в нескольких переменных. Затем я добавляю их в новый объект, чтобы красиво отобразить результаты. Проблема с отображением результатов дисков, меня не смущает, что он отображает все диски в одном столбце, но не показывает все диски. Использование Format-table -autosize не решает проблему. Если я не могу поместить все значения в один столбец, каков правильный подход к динамическому отображению буквы диска в собственном назначенном поле. ИЕ; Столбец 1 для значения диска 1, столбец 2 для значения диска 2... Я удалил некоторые коды ниже, чтобы уменьшить количество строк.

    $BootTime = GET-WmiObject win32_Operatingsystem -ComputerName $server -EA 
STOP | select @{n='ServerName';e={$_.csname}},@{n='LastBootUpTime';e={$_.ConverttoDateTime($_.lastbootuptime)}}                         ,@{n='LocalTime';e={$_.ConverttoDateTime($_.LocalDateTime)}} 


 $Disks = Get-WmiObject win32_logicaldisk -ComputerName $server -Filter Drivetype=3 |`
         Select-Object @{n = "Drive Letter";e = {$_.DeviceID}},`
                        @{n = "Total(GB)";e = {"{0:N1}" -f( $_.Size / 1gb)}},`
                        @{n = "FreeSpace(GB)";e = {"{0:N1}" -f( $_.Freespace / 1gb ) }},`
                        @{n = "FreeSpace(%)"; e = {"{0:P0}" -f ($_.freespace/$_.size)}}

New-Object -Type PSObject -Property @{
                        ServerName = $BootTime.Servername
                        LastBootTime = $BootTime.LastBootUptime
                        LocalTime = $BootTime.LocalTime 
                        UpTime = $BootTime.UpTime
                        OS = $BootTime.OS 
                        Domain = $Domain.Domain
                        Drive = $Disks."Drive Letter"
                        "Disks(GB)" = $Disks."Total(GB)"
                        "FreeSpace(GB)" = $Disks."FreeSpace(GB)"
                        "FreeSpace(%)" = $Disks."FreeSpace(%)"
                                                                            } 
                }
                CATCH
                {
New-Object -Type PSObject -Property @{
ServerName = $Server
LastBootTime = "Try Pinging"
LocalTime = "WMI Not Responding"
UpTime = "Possibly WMI not functioning or server is hung"#$null
OS = $null

Drive = $null
"Disks(GB)" = $null
"FreeSpace(GB)" = $null
"FreeSpace(%)" = $null
"Memory(GB)" =$null
PhysicalCPU = $null
  CPUName     = $null
  Cores       = $null
Manufacturer = $null 
Model = $null
                                                        } 

                }

            } 

    $Output| Select ServerName,LastBootTime, LocalTime, UpTime,Domain,OS, PhysicalCPU, CPUName, Cores, "Memory(GB)", Drive, "Disks(GB)", "FreeSpace(GB)", "FreeSpace(%)" , Manufacturer, Model



Current Results:
Drive         : {C:, E:, F:, G:...}
Disks(GB)     : {149.7, 500.0, 1,945.0, 1,024.0...}
FreeSpace(GB) : {90.0, 358.6, 1,411.1, 909.9...}
FreeSpace(%)  : {60%, 72%, 73%, 89%...}

Desired Results: 
Drive         : {C:, E:, F:, G:,H:}
Disks(GB)     : {149.7, 500.0, 1,945.0, 1,024.0,100}

OR
Drive1 : C:
Drive2:  D:
Disk(GB) 1 :149.7
Disk(GB) 2 : 500.0

person Laurent    schedule 13.06.2019    source источник
comment
После очистки вашего кода и его запуска я смог перечислить все диски на моей машине. Каких дисков вам не хватает? Не забывайте, что вы получаете только диски типа 3 :)   -  person I.T Delinquent    schedule 13.06.2019
comment
У меня более 4 дисков типа 3. Текущие результаты будут показывать до 4 дисков, а остальные диски отображаются как «…». Я хотел бы видеть все диски.   -  person Laurent    schedule 13.06.2019


Ответы (1)


Это будет мой ответ:

$server="localhost"
$BootTime = GET-WmiObject win32_Operatingsystem -ComputerName $server -EA STOP | select @{n='ServerName';e={$_.csname}},@{n='LastBootUpTime';e={$_.ConverttoDateTime($_.lastbootuptime)}},@{n='LocalTime';e={$_.ConverttoDateTime($_.LocalDateTime)}},Caption,OSArchitecture
$Disks = Get-WmiObject win32_logicaldisk -ComputerName $server -Filter Drivetype=3 | Select-Object @{n = "Drive Letter";e = {$_.DeviceID}},@{n = "Total(GB)";e = {"{0:N1}" -f( $_.Size / 1gb)}},@{n = "FreeSpace(GB)";e = {"{0:N1}" -f( $_.Freespace / 1gb ) }},@{n = "FreeSpace(%)"; e = {"{0:P0}" -f ($_.freespace/$_.size)}}

try{

    foreach($disk in $disks){
        New-Object -Type PSObject -Property @{
            ServerName = $BootTime.Servername
            LastBootTime = $BootTime.LastBootUptime
            LocalTime = $BootTime.LocalTime  
            #UpTime = $BootTime.UpTime #not in code
            OS = $BootTime.Caption
            OSArchitecture  = $BootTime.OSArchitecture
            Domain = $Domain.Domain
            "Letter"= $disk."Drive Letter"
            "Disk(GB)" = $disk."Total(GB)"
            "FreeSpace(GB)" = $disk."FreeSpace(GB)"
            "FreeSpace(%)" = $disk."FreeSpace(%)"
         }   
    }
}
CATCH{
    Write-Error $_.Exception.Message
    exit -1
}
person Jose Ortega    schedule 13.06.2019
comment
Единственное, что с этим связано, это то, что если у вас есть 20 серверов, и каждый сервер имеет 5 дисков, это 100 строк результатов с множеством избыточных значений в других полях, таких как имя сервера, версия ОС. - person Laurent; 13.06.2019
comment
Я думаю, что в основном вы можете просто экспортировать результаты в таблицу HTML и получить их так, как вы хотели. - person Jose Ortega; 13.06.2019