как удалить фигурные скобки и получить правильный вывод в CSV-файл - PullRequest
2 голосов
/ 23 марта 2019

Я пытаюсь получить список vm из nutanix с name, ipaddress, Вывод, который я получаю, включает ipaddress с фигурными скобками, который дает вывод как System.String[]

Я взял всезначения в массиве с помощью цикла for, после чего значения были экспортированы в csv

Сценарий, который я написал, выглядит следующим образом:

foreach ($vmachine in $vm){
   $obj = "" | Select "vmName", "ipAddresses", "description", "protectionDomainName", "powerState"
   $obj.vmName = $vmachine.vmName
   $obj.ipAddresses = $vmachine.ipAddresses
   $obj.description = $vmachine.description
   $obj.protectionDomainName = $vmachine.protectionDomainName
   $obj.powerState = $vmachine.powerState

   $outArrayVM += $obj
   $obj =$null
}
$outArrayVM | Export-Csv d:\z.csv

Ожидаемый вывод должен иметь некоторый IP-адрес, такой как 10.x.x.x, но я получаю @{ipAddresses=System.String[]}

1 Ответ

3 голосов
/ 23 марта 2019

Это происходит потому, что $vmachine.ipAddresses является объектом массива строк. Вы хотите строковое представление этого с управляемым форматированием. Есть много способов сделать это. Вот тот, который соединит несколько IP (если они существуют), используя ;. Если IP-адрес только один, он будет отображаться без точки с запятой:

$obj.ipAddresses = $vmachine.ipAddresses -join ";"

Вот пример вашего сценария:

$ip = @("10.1.23.45")
$ip.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

$obj.name = "test"
$obj.ip = $ip
$obj

name ip
---- --
test {10.1.23.45}

$obj | convertto-csv

#TYPE Selected.System.String
"name","ip"
"test","System.Object[]"

Преобразование свойства ip $obj в строку заставляет PowerShell интерпретировать свойство как строку, а не как коллекцию. Таким образом, обозначение фигурных скобок ({}) исчезает.

$obj.ip = $ip -join ";"
$obj | convertto-csv

#TYPE Selected.System.String
"name","ip"
"test","10.1.23.45"

Вот несколько других вариантов установки значения свойства ip в виде строки:

$obj.ip = -join $ip # No join character here. Works best with only one IP.
$obj.ip = $ip[0] # Accesses first element of array $ip, which will be a string. Only works with one IP.
$obj.ip = [string]$ip # Uses string type accelerator to cast $ip as string. This will join multiple IPs with a space between each IP.

Пояснение:

При запуске ConvertTo-Csv или Export-Csv свойство входного объекта преобразуется с использованием метода ToString(). Если ссылочный тип этого свойства объекта (в данном случае System.Array) не имеет переопределения для метода ToString(), тогда этот метод возвратит полное имя типа свойства. В данном случае это FQTN System.Object[]. Это предсказуемо с небольшим копанием.

При тестировании с [Int32] можно ожидать, что преобразование строк предоставит строковое представление целочисленных данных, поскольку оно имеет переопределение:

$int = 1
$int.gettype().fullname

System.Int32

($int | Get-Member).where{$_.Name -eq "ToString"}

   TypeName: System.Int32

Name     MemberType Definition
----     ---------- ----------
ToString Method     string ToString(), string ToString(string format), string ToString(System.IFormatProvider provid...

$int.ToString()
1
$int.ToString().gettype().fullname
System.String

При тестировании с [Array] вы бы не ожидали, что преобразование строки предоставит строковое представление данных массива, потому что не имеет переопределение:

$arr = [array]1
$arr.gettype().fullname
System.Object[]
([System.Object[]] | Get-Member -Static).where{$_.name -eq "ToString"}

$arr.toString()
System.Object[]

См. Export-Csv и Метод Object.ToString для дополнительных пояснений и примеров.

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