Push-вывод результатов в массив - PullRequest
0 голосов
/ 03 июля 2019

Я использую приведенную ниже команду scrpt, чтобы вернуть результирующий набор емкости диска из списка всех доступных серверов в нашем регионе.Я хотел бы добавить выходные данные и объединить их в один набор данных, чтобы его было легко отображать и запрашивать.Я знаю, как добавить значения в массив с одним столбцом, однако, поскольку это потребует нескольких, я не уверен, как это сделать.Можно ли добавить набор результатов из этого вывода в массив?

$myarray = @("")
$servers =
   @(
         'SERVER1'
        ,'SERVER2'
        ,'SERVER3'
        ,'SERVER4'
        ,'SERVER5'
        ,'SERVER6'

    )
$wmiQuery = @"
SELECT
    SystemName,Name,DriveType,FileSystem,FreeSpace,Capacity,Label
FROM
    Win32_Volume
"@

Foreach ($server in $servers)
{

        Get-WmiObject -ComputerName $server -Query $wmiQuery| Select-Object @{Name = "Computer"; Expression={$server}},Name,
        Label,
        @{Name = "SizeInGB"; Expression={"{0:N2}"-f ($_.Capacity/1GB)}},
        @{Name = "UsedSizeInGB"; Expression={"{0:N2}"-f (($_.Capacity - $_.FreeSpace)/1GB)}},
        @{Name = "FreeSizeInGB"; Expression={"{0:N2}"-f ($_.FreeSpace/1GB)}},
        @{Name = "FreePerc"; Expression={"{0:N2}"-f (($_.FreeSpace/1GB)/($_.Capacity/1GB))}}|Where-Object FreePerc -LE 0.16|Format-Table

}

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Это можно сделать, сохранив выходные данные цикла foreach в массиве.

$servers = @('SERVER1','SERVER2','SERVER3','SERVER4','SERVER5','SERVER6')
$wmiQuery = @"
SELECT
    SystemName,Name,DriveType,FileSystem,FreeSpace,Capacity,Label
FROM
    Win32_Volume
"@
$myarray = Foreach ($server in $servers)
{

    Get-WmiObject -ComputerName $server -Query $wmiQuery |
      Select-Object @{Name = "Computer"; Expression={$server}},Name,Label,
      @{Name = "SizeInGB"; Expression={"{0:N2}"-f ($_.Capacity/1GB)}},
      @{Name = "UsedSizeInGB"; Expression={"{0:N2}"-f (($_.Capacity - $_.FreeSpace)/1GB)}},
      @{Name = "FreeSizeInGB"; Expression={"{0:N2}"-f ($_.FreeSpace/1GB)}},
      @{Name = "FreePerc"; Expression={"{0:N2}"-f (($_.FreeSpace/1GB)/($_.Capacity/1GB))}}|Where-Object FreePerc -LE 0.16

}
$myarray | Format-Table

Я удалил Format-Table из цикла, потому что вы должны использовать команды Format-* только тогда, когда вы показываете свой окончательный вывод, а не когда вы собираетесь использовать этот вывод для другой обработки. Переменная $myarray будет массивом, где каждый элемент является объектом со свойствами из вашего запроса Get-WmiObject.

0 голосов
/ 03 июля 2019

Я думаю, что лучший способ сделать это, следуя тому, что показано в этом сообщении в блоге от Microsoft

По сути, вы можете создать вложенную хеш-таблицу. Одна хеш-таблица для всех серверов, а затем другая вложенная в нее для значений. Это маленький пример для вас:)

$resultsHash = @{
    SERVER1 = @{
        SizeInGB=""
        UsedSizeInGB=""
        FreeSizeInGB=""
        FreePerc=""
    }
    SERVER2 = @{
        SizeInGB=""
        UsedSizeInGB=""
        FreeSizeInGB=""
        FreePerc=""
    }
}
...