Как выполнить «ВНУТРЕННЕЕ СОЕДИНЕНИЕ» объектов PowerShell?

Я пытаюсь запросить различную информацию о состоянии физического диска.

У меня есть два запроса, каждый из которых возвращает отдельную информацию о PhysicalDisk.

      >Get-PhysicalDisk | Select-Object DeviceId, FriendlyName, Model, SerialNumber, Usage, HealthStatus, CanPool, CannotPoolReason | Format-Table

В реляционных базах данных SQL Server это будетпо идентификатору устройства.

Как я могу объединить эти два набора результатов в один набор?

2 ответа

Почему бы просто не сделать это обычным способом PowerShell, никаких дополнительных действий не требуется. Просто обычный конвейер с рассчитанными свойствами. Ну, можно было бы также использовать хеш-таблицу или PSCustomObject.

      Clear-Host
Get-PhysicalDisk | 
ForEach-Object {
    ($RecordData = $PSItem) | 
    Get-StorageReliabilityCounter | 
    Select-Object -Property @{
                                Name       = 'DeviceId'
                                Expression = {$RecordData.DeviceId}
                            }, 
                            @{
                                Name       = 'FriendlyName'
                                Expression = {$RecordData.FriendlyName}
                            }, 
                            @{
                                Name       = 'Model'
                                Expression = {$RecordData.Model}
                            }, 
                            @{
                                Name       = 'SerialNumber'
                                Expression = {$RecordData.SerialNumber}
                            }, 
                            @{
                                Name       = 'Usage'
                                Expression = {$RecordData.Usage}
                            }, 
                            @{
                                Name       = 'HealthStatus'
                                Expression = {$RecordData.HealthStatus}
                            }, 
                            @{
                                Name       = 'CanPool'
                                Expression = {$RecordData.CanPool}
                            }, 
                            @{
                                Name       = 'CannotPoolReason'
                                Expression = {$RecordData.CannotPoolReason}
                            },
                            Number, PowerOnHours, ReadErrorsTotal, 
                            Temperature, ReadLatencyMax, WriteLatencyMax
}
# Results
<#
...

DeviceId         : 1
FriendlyName     : Samsung SSD 950 PRO 512GB
Model            : Samsung SSD 950 PRO 512GB
SerialNumber     : 0000_0000_0000_0000
Usage            : Auto-Select
HealthStatus     : Healthy
CanPool          : False
CannotPoolReason : Insufficient Capacity
Number           : 
PowerOnHours     : 
ReadErrorsTotal  : 
Temperature      : 34
ReadLatencyMax   : 252
WriteLatencyMax  : 70
...
#>

Clear-Host
Get-PhysicalDisk | 
ForEach-Object {
    ($RecordData = $PSItem) | 
    Get-StorageReliabilityCounter | 
    Select-Object -Property @{
                                Name       = 'DeviceId'
                                Expression = {$RecordData.DeviceId}
                            }, 
                            @{
                                Name       = 'FriendlyName'
                                Expression = {$RecordData.FriendlyName}
                            }, 
                            @{
                                Name       = 'Model'
                                Expression = {$RecordData.Model}
                            }, 
                            @{
                                Name       = 'SerialNumber'
                                Expression = {$RecordData.SerialNumber}
                            }, 
                            @{
                                Name       = 'Usage'
                                Expression = {$RecordData.Usage}
                            }, 
                            @{
                                Name       = 'HealthStatus'
                                Expression = {$RecordData.HealthStatus}
                            }, 
                            @{
                                Name       = 'CanPool'
                                Expression = {$RecordData.CanPool}
                            }, 
                            @{
                                Name       = 'CannotPoolReason'
                                Expression = {$RecordData.CannotPoolReason}
                            },
                            Number, PowerOnHours, ReadErrorsTotal, 
                            Temperature, ReadLatencyMax, WriteLatencyMax
} | 
Format-Table -AutoSize
# Results
<#
DeviceId FriendlyName              Model                     SerialNumber         Usage       HealthStatus CanPool CannotPoolReason      Number PowerOnHours
-------- ------------              -----                     ------------         -----       ------------ ------- ----------------      ------ ------------
...
1        Samsung SSD 950 PRO 512GB Samsung SSD 950 PRO 512GB 0000_0000_0000_0000. Auto-Select Healthy        False Insufficient Capacity                    
...                    
#>

Вы можете использовать модуль Join-Object для выполнения задачи.

Объедините данные из двух наборов объектов на основе общего значения.

  • Установите модуль Join-Object
      Install-Module -Name Join-Object
  • Создайте два списка
      $FirstList = Get-PhysicalDisk | Select-Object DeviceID, FriendlyName, Model, SerialNumber, Usage, HealthStatus, CanPool, CannotPoolReason
$SecondList = Get-PhysicalDisk | Get-StorageReliabilityCounter | Select-Object Number, DeviceId, PowerOnHours, ReadErrorsTotal, Temperature, ReadLatencyMax, WriteLatencyMax
  • Присоединяйтесь к спискам с помощью Join-Object
      $JoinedResult = Join-Object -left $FirstList -Right $SecondList -LeftJoinProperty DeviceID -RightJoinProperty DeviceID -KeepRightJoinProperty -Type OnlyIfInBoth -Prefix r_

$JoinedResult | Select DeviceID, FriendlyName, Model, SerialNumber, Usage, HealthStatus, CanPool, CannotPoolReason, r_PowerOnHours,r_ReadErrorsTotal, r_Temperature, r_ReadLatencyMax, r_WriteLatencyMax

Из данных Connect с модулем Join-Object PowerShell приведено объяснение параметров Join-Object (замените там, где упоминается: $process на $FirstList, $services на $Secondlist, name на DevideID и service на r ) .

  1. У нас есть --Left и --Right. Это просто объекты, которые мы хотим объединить, то есть $processes и $services, как определено выше.
  2. Мы используем команды --LeftJoinProperty и --RightJoinProperty. Это свойство этих двух объектов, которое мы хотим объединить. В этом случае они имеют одно и то же имя, то есть «имя».
  3. Следующий параметр, --KeepRightJoinProperty, включает свойство правого соединения в выходные данные операции соединения. Я продемонстрирую это далее в этом уроке.
  4. Параметр --Type важен, поскольку здесь вы указываете, какой тип соединения вы хотите выполнить. Я использовал OnlyIfInBoth, чтобы увидеть любые процессы и службы с тем же именем.

Другие параметры, взятые непосредственно из справки PowerShell, следующие:

  • AllInLeft. Это параметр по умолчанию, который отображает все элементы Left в выходных данных хотя бы один раз, в зависимости от того, сколько элементов применяется в Right.
  • AllInRight. Это похоже на AllInLeft.
  • ТолькоЕслиВБот. Помещает в выходные данные все элементы слева, независимо от того, сколько совпадений найдено справа.
  • AllInBoth. Включает в вывод все записи как справа, так и слева.
  1. Последний параметр — --Prefix. Это используется для префикса каждого свойства Right в объединении с любой строкой, которую вы решите. В данном случае я использовал _service.
Другие вопросы по тегам