根据共同值将一个哈希值 table 添加到另一个哈希值

Adding one hash table to another based on a common value

Windows 有两个 PowerShell 命令用于获取有关磁盘 Get-PhysicalDiskGet-Disk.

的信息

I 运行 命令 Get-PhysicalDisk 然后尝试使用两个命令的输出中存在的公共值将命令的输出附加到 Get-Disk 的结果,这个值为 SerialNumber.

我确信这是一个简单的哈希 table 要求,我无法理解它。

$PhysicalDisks = Get-PhysicalDisk |
                 Select OperationalStatus, HealthStatus, BusType, FriendlyName,
                     Manufacturer, SerialNumber
foreach ($Disk in $PhysicalDisks) {
    $AdditionalDiskInfo = Get-Disk |
                          Where SerialNumber -eq $_.SerialNumber |
                          select PartitionStyle, ProvisioningType,
                              NumberOfPartitions, Signature

    # I know this isn't anywhere near correct, I'm just trying to explain my
    # end goal :)
    #$PhysicalDisks + $AdditionalDiskInfo |
    #    Where $PhysicalDisks.SerialNumber -eq $AdditionalDiskInfo.SerialNumber
}

我的预期结果是结合以下内容:

PS> 获取物理磁盘 | Select OperationalStatus、HealthStatus、BusType、
友好名称、制造商、序列号
运行状态:OK
健康状况:健康
总线类型:SATA
友情名称:KINGSTON SV310S37A960G
制造商      :
序列号:50026B724800A34E

还有这个:

PS> 获取磁盘 |其中 SerialNumber -eq "50026B724800A34E" | select PartitionStyle、ProvisioningType、NumberOfPartitions、签名 |格式列表
分区类型:MBR
配置类型:固定
分区数:2
签字:1364200743

给我这个:

运行状态:OK
健康状况:健康
总线类型:SATA
友情名称:KINGSTON SV310S37A960G
制造商      :
序列号:50026B724800A34E
分区类型:MBR
配置类型:固定
分区数:2
签字:1364200743

您可以像这样在循环中构建自定义对象:

foreach ($Disk in $PhysicalDisks) {
    $info = Get-Disk |
            Where-Object { $Disk.SerialNumber -eq $_.SerialNumber.Trim() }

    New-Object -Type PSObject -Property @{
        'OperationalStatus'  = $Disk.OperationalStatus
        'HealthStatus'       = $Disk.HealthStatus
        'BusType'            = $Disk.BusType
        'FriendlyName'       = $Disk.FriendlyName
        'Manufacturer'       = $Disk.Manufacturer
        'SerialNumber'       = $Disk.SerialNumber
        'PartitionStyle'     = $info.PartitionStyle
        'ProvisioningType'   = $info.ProvisioningType
        'NumberOfPartitions' = $info.NumberOfPartitions
        'Signature'          = $info.Signature
    }
}

但是,创建一个将序列号映射到 Get-Disk 数据的哈希表,然后将相关信息添加为计算属性,您可以在其中按序列号查找信息,这可能会更简单。

$info = @{}
Get-Disk | ForEach-Object {
    $info[$_.SerialNumber.Trim()] = $_
}

Get-PhysicalDisk |
    Select-Object OperationalStatus, HealthStatus, BusType, FriendlyName,
        Manufacturer, SerialNumber,
        @{n='PartitionStyle';e={$info[$_.SerialNumber].PartitionStyle}},
        @{n='ProvisioningType';e={$info[$_.SerialNumber].ProvisioningType}},
        @{n='NumberOfPartitions';e={$info[$_.SerialNumber].NumberOfPartitions}},
        @{n='Signature';e={$info[$_.SerialNumber].Signature}}