Получение "System.Collections.Generic.List`1 [System.String]" в CSV-файле экспорта, когда данные на экране в порядке - PullRequest
1 голос
/ 11 марта 2019

Я новичок в PowerShell и пытаюсь получить список имен виртуальных машин и связанных с ними IP-адресов из Hyper-V.

Я получаю информацию на экране, но когда я пытаюсь экспортировать вCSV все, что я получаю для IP-адресов, это "System.Collections.Generic.List`1 [System.String]" в каждой строке.

Есть предложения о "соединениях" или "ConvertTo-CSV", но яНе понимаю синтаксис для них.

Кто-нибудь может помочь?

Это синтаксис, который я использую ...

Get-VM | Select -ExpandProperty VirtualNetworkAdapters | select name, IPV4Addresses | Export-Csv -Path "c:\Temp\VMIPs.csv"

1 Ответ

1 голос
/ 11 марта 2019

Если объект, который вы экспортируете как CSV с Export-Csv или ConvertTo-Csv, имеет значения свойств, которые содержат коллекцию (массив) значений, эти значения stringifiedчерез их .ToString() метод , который приводит к бесполезному представлению, как в случае вашего массива .IPV4Addresses свойство.

Чтобы продемонстрировать это с помощью командлета ConvertTo-Csv (который работает аналогичнов Export-Csv, но возвращает данные CSV вместо сохранения их в файл):

PS> [pscustomobject] @{ col1 = 1; col2 = 2, 3 } | ConvertTo-Csv
"col1","col2"
"1","System.Object[]"

То есть массив 2, 3, сохраненный в свойстве .col2, былбесполезно строковое значение System.Object[], которое вы получаете, когда вызываете .ToString() в обычном массиве PowerShell;другие типы коллекций .NET - такие как [System.Collections.Generic.List[string]] в вашем случае - аналогично;то есть по их имени типа .


Предполагается, что вы хотите представить все значения свойства со значением массива в одном CSV-столбце, чтобы исправитьэта проблема , вы должны принять решение о значимом строковом представлении для коллекции в целом и реализовать его, используя Select-Object с вычисленным свойством :

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

PS> [pscustomobject] @{ col1 = 1; col2 = 2, 3 } | 
      Select-Object col1, @{ n='col2'; e={ $_.col2 -join ' ' } } |
        ConvertTo-Csv
"col1","col2"
"1","2 3"

Обратите внимание, как массив 2, 3 превратился в строку '2 3'.

...