Это происходит потому, что $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 для дополнительных пояснений и примеров.