如何组合一个PowerShell数组和一个PowerShell对象中的项并生成第三个PowerShell对象



我有一个名为$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的对象,它包含以下列表

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

获得会员显示在下方

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列表中找到匹配的项目。如果找到,则返回一个合并了属性的新对象。

$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

控制台输出:

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

为什么不创建一个基于资源组名称的哈希表呢。然后,当使用$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的版本。我没有详尽地阅读这篇文章,但我怀疑它可以为我们做这样的事情。这只是一个例子。

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

相关内容

  • 没有找到相关文章

最新更新