Как выполнить «ВНУТРЕННЕЕ СОЕДИНЕНИЕ» объектов 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 ) .
- У нас есть --Left и --Right. Это просто объекты, которые мы хотим объединить, то есть $processes и $services, как определено выше.
- Мы используем команды --LeftJoinProperty и --RightJoinProperty. Это свойство этих двух объектов, которое мы хотим объединить. В этом случае они имеют одно и то же имя, то есть «имя».
- Следующий параметр, --KeepRightJoinProperty, включает свойство правого соединения в выходные данные операции соединения. Я продемонстрирую это далее в этом уроке.
- Параметр --Type важен, поскольку здесь вы указываете, какой тип соединения вы хотите выполнить. Я использовал OnlyIfInBoth, чтобы увидеть любые процессы и службы с тем же именем.
Другие параметры, взятые непосредственно из справки PowerShell, следующие:
- AllInLeft. Это параметр по умолчанию, который отображает все элементы Left в выходных данных хотя бы один раз, в зависимости от того, сколько элементов применяется в Right.
- AllInRight. Это похоже на AllInLeft.
- ТолькоЕслиВБот. Помещает в выходные данные все элементы слева, независимо от того, сколько совпадений найдено справа.
- AllInBoth. Включает в вывод все записи как справа, так и слева.
- Последний параметр — --Prefix. Это используется для префикса каждого свойства Right в объединении с любой строкой, которую вы решите. В данном случае я использовал _service.