#powershell
#powershell
Вопрос:
Ниже приведены 2 таблицы, которые у меня есть, которые я получил из запроса
Таблица -1
Servername Type max avg
lnx0401.ch3.prod.i.com AS 100 40
lnx0402.ch3.prod.i.com AS 99 30
lnx0576.ch3.prod.i.com AS 34 3
lnx0577.ch3.prod.i.com AS 94 8
lnx0578.ch3.prod.i.com AS 99 21
Таблица -2
Servername Type Count
lnx0401.ch3.prod.i.com AS 86
lnx0402.ch3.prod.i.com AS 42
Вывод должен быть следующим
Servername Type max avg count
lnx0401.ch3.prod.i.com AS 100 40 86
lnx0402.ch3.prod.i.com AS 99 30 42
lnx0576.ch3.prod.i.com AS 34 3 0
lnx0577.ch3.prod.i.com AS 94 8 0
lnx0578.ch3.prod.i.com AS 99 21 0
необходимо сопоставить данные таблицы -2 с таблицей -1, и если сервер присутствует в таблице — 1, необходимо выбрать счетчик из таблицы -2 и создать итоговую таблицу, иначе против count будет указано 0.
Пожалуйста, дайте мне знать, как это сделать
пробовал, но запутался
$hashB=@{}
foreach($records in $data_2)
{
$hashB[$records.servername] = $records
}
$data_1 | foreach{
$record = $_
$other = $hashB[$record.servername]
[pscustomobject]@{ServerName=$_.servername
RoleType=$_.RoleType
CPUMax = $_.cpumax
CPUAvg = $_.cpuavg
PeakCount = $other.peakcount}
}
Ответ №1:
Вы можете сделать это без установки какого-либо модуля с
$table3 = $table1 | ForEach-Object {
$server = $_.Servername
$_ | Select-Object *, @{Name = 'Count'; Expression = {[int]($table2 | Where-Object {$_.Servername -eq $server}).Count}}
}
# output on screen
$table3 | Format-Table -AutoSize
# output to CSV
$table3 | Export-Csv -Path 'table3.csv' -NoTypeInformation
Вывод на экран
Servername Type max avg Count
---------- ---- --- --- -----
lnx0401.ch3.prod.i.com AS 100 40 86
lnx0402.ch3.prod.i.com AS 99 30 42
lnx0576.ch3.prod.i.com AS 34 3 0
lnx0577.ch3.prod.i.com AS 94 8 0
lnx0578.ch3.prod.i.com AS 99 21 0
Комментарии:
1. Спасибо за ваш ответ. точно ищу это, но одна небольшая проблема. на выходе вместо Count =0 оно становится пустым.
2. @EmptyCoder Вы можете привести результат в выражении к
[int]
. Это приведет к тому, что a0
будет пустым. (отредактировано в коде). Какую версию PowerShell вы используете?3. сработало точно. еще раз спасибо.использование powershell 5.1.14409.1018
Ответ №2:
используйте модуль join-object, это позволит объединить 2 массива без каких-либо циклов. В примере, который я использую csv из импорта, вам не нужно, вы можете просто использовать массивы. Пример
Установка-Объединение модуля-объект
$test = Импорт-Csv C:Temptest1.csv
$test2 = Импорт-Csv C:Temptest2.csv
Join-Object -Left $test -LeftJoinProperty Имя_сервера -Справа $test2 -RightJoinProperty имя_сервера -количество правых свойств
https://www.powershellgallery.com/packages/Join-Object/2.0.1