我有一个名为$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
的版本。我没有详尽地阅读这篇文章,但我怀疑它可以为我们做这样的事情。这只是一个例子。
老实说,我通常手动编写上面的代码。