Давайте создавать книгиРабота с (членами) гетерогенных массивов
$a = New-Object –TypeName PSObject
$a | Add-Member –MemberType NoteProperty –Name Title –Value "Journey to the West"
$a | Add-Member –MemberType NoteProperty –Name Price –Value 12
$b = New-Object –TypeName PSObject
$b | Add-Member –MemberType NoteProperty –Name Title –Value "Faust"
$b | Add-Member –MemberType NoteProperty –Name Author –Value "Goethe"
$array1 = $a,$b
$array2 = $b,$a
Теперь давайте показывать эти два массива
PS D:\Developpement\Powershell> $array1
Title Price
----- -----
Journey to the West 12
Faust
PS D:\Developpement\Powershell> $array2
Title Author
----- ------
Faust Goethe
Journey to the West
Так, насколько я понимаю, это в основном означает, что то, что Powershell считают свойства массива - это свойства его первого элемента (на самом деле это даже не так, потому что если первый элемент равен $null
, то следующий будет рассмотрен). Теперь, также подразумевает, что:
- если вы звоните
Get-Member
на массиве, вы получите только член первого элемента - если вы звоните
Convert-ToCvs
на массиве, вы будете экспортировать только значение свойств для свойств определяются первый элемент - и т.д.
Я с трудом понимаю, что позади рациональные и это поведение сделало раздражающе болезненным для меня работать с разнородными массивами в PowerShell.
Я хотел бы импортировать данные из разных внешних источников, обрабатывать их, а затем экспортировать их в файл cvs. Элементы аналогичны, но большинство из них непредсказуемо пропускают некоторые свойства. Есть ли очевидный способ справиться с этим в Powershell без перепрограммирования колеса?
'$ array | sel ect ($ array |% {$ _. PSObject.Properties} | select -exp name -u) | ConvertTo-Csv' – PetSerAl
'Get-Member' показывает набор элементов для первого объекта каждого отдельного типа в массиве. '$ A.pstypenames.Insert (0, "BookForSale"); $ A1 | gm' –