Как объединить элементы из одного массива PowerShell и одного объекта Powershell и создать третий объект PowerShell? - PullRequest
0 голосов
/ 01 августа 2020

У меня есть один массив PowerShell с именем $ vmSizelist, член которого выглядит следующим образом:

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

Get- Элемент показан ниже

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

Ответы [ 2 ]

1 голос
/ 01 августа 2020

Это не так уж сложно. Просто l oop поверх элементов в $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             8192      
VM2  Standard_D14_v2 RG2           16            114688
0 голосов
/ 01 августа 2020

Почему бы не создать таблицу ha sh с ключом для имени группы ресурсов. Затем вы можете легко ссылаться на него, добавляя свойства в команду Select-Object, используя свойство $_.VMSize из объектов в массиве $VMSizeList. Это будет выглядеть примерно так:

$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, работающих на inte rnet. Я не читал полностью этот , но подозреваю, что он может сделать что-то подобное для нас. Это всего лишь 1 пример.

Честно говоря, я обычно вручную кодирую что-то вроде выше.

Надеюсь, это добавит к разговору, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...