Как использовать powershell для сериализации списков в хеш-таблицах / массивах? - PullRequest
0 голосов
/ 27 апреля 2018

Я сериализирую вывод следующего фрагмента скрипта, $ VM содержит виртуальную машину, хранящуюся в Get-VM.

$VM.VMId | Get-VHD | Select @{N="Name";E={$VM.Name}},@{N="Disks";E={[math]::Round($_.Size/1GB,1)}}

Вывод выглядит так:

Name                                                                                                                                             Disks
----                                                                                                                                             -----
ServerXYZ                                                                                                                                        136,7
ServerXYZ                                                                                                                                        465,7

Но я хочу как-то сериализовать это, чтобы вместо этого дать мне:

Name                                                                                                                                             Disks
----                                                                                                                                             -----
ServerXYZ                                                                                                                                136,7 + 465,7

Я тщетно пытался добавить -join "+" немного здесь и там в коде безрезультатно.

Я позже дошел до этой точки:

$VM.Name, (($VM.VMId | Get-VHD | foreach{ [math]::round($_.size/1GB,1)}) -join " + ")

Этот вид близок к фактическому составлению списка правильных данных, который выглядит как «ServerXYZ, 136,7 + 465,7», но мне нужно будет отформатировать его как массив или хеш-таблицу с парами ключ-значение.

1 Ответ

0 голосов
/ 27 апреля 2018

Вот один из способов сделать это:

$vm.VMId | 
    Get-VHD |
        Select-Object @{N="Name";E={$VM.Name}},@{N="DiskSize";E={[math]::Round($_.Size/1gb,3)}} |
            Group-Object Name |
                ForEach-Object {
                    [PsCustomObject]@{
                        Name = $_.Name
                        Disks = $_.Group.DiskSize
                    }
                }

Это дает вывод как это:

Name        Disks                       
----        -----                       
Server 1   {28.41, 0.223, 0.848, 0.816}

Если вы действительно хотите использовать знак «+», замените эту строку:

Disks = $_.Group.DiskSize

с:

Disks = ($_.Group.DiskSize -join ' + ')

Это дает:

Name        Disks                        
----        -----                        
Server1     28.41 + 0.223 + 0.848 + 0.816
...