繁体   English   中英

How to combine items from one PowerShell Array and one Powershell Object and produce a 3rd PowerShell Object?

[英]How to combine items from one PowerShell Array and one Powershell Object and produce a 3rd PowerShell Object?

我有一个名为 $vmSizelist 的 PowerShell 数组,其成员如下

TypeName   : System.Management.Automation.PSCustomObject
Name       : Equals
MemberType : Method
Definition : bool Equals(System.Object obj)

It contains the following items as shown below.

Name : VM1
VMSize : Standard_D2s_v3
ResourceGroup : RG1

Name : VM2
VMSize : Standard_D14_v2
ResourceGroup : RG2

我有另一个名为 $AllVMSize 的 object 包含以下列表

Name        NumberOfCores MemoryInMB MaxDataDiskCount OSDiskSizeInMB ResourceDiskSizeInMB

Standard_B1ls         1        512                2        1047552                 4096
Standard_B1ms         1       2048                2        1047552                 4096
Standard_B1s          1       1024                2        1047552                 4096
Standard_B2ms         2       8192                4        1047552                16384
Standard_B2s          2       4096                4        1047552                 8192
Standard_D2s_v3       2       8192                4        1047552                16384
Standard_D14_v2      16      114688              64        1047552               819200

Get-Member 显示如下

Name                 MemberType Definition
----                 ---------- ----------
Equals               Method     bool Equals(System.Object obj)
GetHashCode          Method     int GetHashCode()
GetType              Method     type GetType()
ToString             Method     string ToString()
MaxDataDiskCount     Property   System.Nullable[int] MaxDataDiskCount {get;set;}
MemoryInMB           Property   int MemoryInMB {get;set;}
Name                 Property   string Name {get;set;}
NumberOfCores        Property   int NumberOfCores {get;set;}
OSDiskSizeInMB       Property   int OSDiskSizeInMB {get;set;}
RequestId            Property   string RequestId {get;set;}
ResourceDiskSizeInMB Property   int ResourceDiskSizeInMB {get;set;}
StatusCode           Property   System.Net.HttpStatusCode StatusCode {get;set;}

我想将数组中的成员和上面的 PSObject 合并,并想在下面生成第三个 PSObject/Array:

Name VMSize           ResourceGroup NumberOfCores MemoryInMB
VM1  Standard_D2s_v3  RG1           2             8192
VM2  Standard_D14_v2  RG2           16            114688

这并不太难。 只需遍历$vmSizelist中的项目并在$AllVMSize列表中找到匹配的项目。 如果找到,返回一个新的 object 与属性组合。

$result = $vmSizelist | ForEach-Object {
    $vmSize = $_.VMSize
    $refVM = $AllVMSize | Where-Object { $_.Name -eq $vmSize }
    if ($refVM) {
        $_ | Select-Object *, @{Name = 'NumberOfCores'; Expression = {$refVM.NumberOfCores}}, 
                              @{Name = 'MemoryInMB'; Expression = {$refVM.MemoryInMB}}
    }  
}

# output in console
$result | Format-Table -AutoSize

# result to CSV
$result | Export-Csv -Path 'X:\TheCombinedProperties.csv' -NoTypeInformation

控制台中的 Output:

Name VMSize          ResourceGroup NumberOfCores MemoryInMB
---- ------          ------------- ------------- ----------
VM1  Standard_D2s_v3 RG1           2             8192      
VM2  Standard_D14_v2 RG2           16            114688

为什么不创建一个以资源组名称为键的 hash 表。 然后,您可以在使用$VMSizeList数组中对象的$_.VMSize属性在Select-Object命令中添加属性时轻松引用它。 它看起来像:

$ResouceGroupHash = 
$ResourceGroups |
Group-Object -Property Name -AsHashTable -AsString

$vmSizelist =
$vmSizelist |
Select-Object *,
    @{Name = 'NumberOfCores'; Expression = { $ResouceGroupHash[$_.VMSize].NumberOfCores}}, 
    @{Name = 'MemoryInMB'; Expression = { $ResouceGroupHash[$_.VMSize].MemoryInMB}}

我没有对此进行测试,但是它应该可以工作。

另外的选择; 我不知道您是否想为一个小项目拉取模块和/或脚本,但是互联网上有几个版本的东西,比如Join-Object 我没有详尽地阅读这个,但我怀疑它可以为我们做这样的事情。 这只是1个例子。

老实说,我通常手动编写类似上面的代码。

希望这会增加对话,让我知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM