[英]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.