根据名称从数组中选择值

问题描述

我使用以下方法提取sql 实例的一些详细信息:

$sqlInstance1 = Get-DbaInstanceProperty -sqlInstance sql | Select-Object ComputerName,Name,Value  | Where-Object Name -In ("FullyQualifiednetName","Edition","PhysicalMemory","Processors","VersionString","Collation","IsClustered","ResourceLastUpdateDateTime")

将这些值分配给来自这样的数组输出的变量的最佳方法是什么:

计算机名称名称


sql 版企业版(64 位) sql 物理内存 1571485
sql 处理器 40
sql 版本字符串 11.0.7493.4
sql 排序规则 latin1_General_CI_AS
sql IsClustered True
sql ResourceLastUpdateDateTime 24/12/2019 9:58:55 PM
sql FullQualifiednetName PTHsql13.FMG.local

所以我想从上面分配 $ComputerName = ComputerName$Edition = Edition 等,然后我可以用它来更新 sql$ComputerName

解决方法

好的。首先,您需要将结果转换为字典,然后使用该属性字典创建一个新对象。

例如:

$dict = @{ }

(Get-DbaInstanceProperty -SqlInstance localhost | Select-Object ComputerName,Name,Value | Where-Object Name -In ("FullyQualifiedNetName","Edition","PhysicalMemory","Processors","VersionString","Collation","IsClustered","ResourceLastUpdateDateTime")).GetEnumerator() | % { $dict.Add($_.Name,$_.Value) }

New-Object -TypeName PSObject -Property $dict

$result = New-Object -TypeName PSObject -Property $dict

$result.FullyQualifiedNetName

$result.Processors

上面的代码应该打印出 FullyQualifiedNetName 值和 Processors 计数。

,

点符号在这里是您的朋友。由于您存储的是序列化的实际对象,因此您可以使用 .propertiesname 引用存储值的属性。

[array]SQLInstance1 = Get-DbaInstanceProperty -SqlInstance SQL | Select-Object ComputerName,Value  | Where-Object Name -In ("FullyQualifiedNetName","ResourceLastUpdateDateTime")

($SQLInstance1.ComputerName.Count + $SQLInstance1.Name.Count + $SQLInstance1.Value.Count); $i++){
[pscustomobject]@{
            ComputerName = $($SQLInstance1.ComputerName[$i])
            Name = $($SQLInstance1.Name[$i])
            Value = $($SQLInstance1.Value[$i])

                }
        }