2013-02-21 2 views
3

Что я пытаюсь сделать, достаточно просто: создать пользовательский объект с некоторыми свойствами, а затем определить «группы» свойств (столбцов) для использования в Select-Object. Позвольте пояснить:Определить пользовательские наборы свойств (с помощью Add-Member?) Для использования в Select-Object

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6} 
$obj = New-Object PSObject $props 

У меня теперь есть пользовательский объект с некоторыми фиктивными данными. То, что я теперь хочу быть в состоянии сделать это

$obj | select Male 
$obj | select Female 

И то, что я думал, что будет делать трюк, что-то вроде этого:

$obj | Add-Member PropertySet "Male" @("Frank","John") 
$obj | Add-Member PropertySet "Female" @("Mary","Jane","Brenda") 

Это не работает - я получаю эту ошибку:

Add-Member : Cannot convert the "System.Object[]" value of type 
"System.Object[]" to type "System.Collections.ObjectModel.Collection`1[System.String]". 

Я предполагаю, что я должен предоставить другой тип объекта, чем мой массив в Add-Member, но я не уверен, как я должен это сделать.

У кого-нибудь есть опыт?

Важное примечание. Я нахожусь на Powershell 2, и я читал на разных сайтах, что у него есть ошибка, которая не позволяет устанавливать свойства по умолчанию. Это не то, что я хочу сделать - я хочу создать настраиваемый набор свойств, а не стандартный, но может быть, что эта ошибка также мешает мне получить то, что я хочу.

ответ

6

Вы очень близки. Проблема в том, что вы не создаете объект правильно. Вы должны указать параметр -Property, прежде чем указывать хеш-таблицу свойств. Без него вы просто создаете хэш-таблицу. Это работает:

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6} 
$obj = New-Object -TypeName PSObject -Property $props 

$obj | Add-Member PropertySet "Male" @("Frank","John") 
$obj | Add-Member PropertySet "Female" @("Mary","Jane","Brenda") 

$obj | select male 

Frank John 
----- ---- 
    3 5 

Почему это произошло? Если вы читаете синтаксис New-Object с помощью Get-help new-object или Get-Command New-Object -Syntax, вы увидите, что для нормальных .Net типов, синтаксис:

New-Object [-TypeName] <String> [[-ArgumentList] <Object[]>] [-Property <IDictionary>] 

Обратите внимание, что -ArgumentList является вторым параметра Я, не -Property, как вы ожидали. Так что ваш код на самом деле:

$obj = New-Object -TypeName PSObject -ArgumentList $props 

вместо:

$obj = New-Object PSObject -Property $props 

EDIT раствора выше работал только в PS3.0. Он все еще действует, хотя параметр -Property требуется также в PS2.0. В PS2.0 вам нужно передать массив свойств в string[] (string-array), а не в массив объектов (object[]), который является массивом по умолчанию. Полное решение для PS2.0:

$props = @{"Mary"=1;"Jane"=2;"Frank"=3;"John"=5;"Brenda"=6} 
$obj = New-Object -TypeName PSObject -Property $props 

$obj | Add-Member PropertySet "Male" ([string[]]@("Frank","John")) 
$obj | Add-Member PropertySet "Female" ([string[]]@("Mary","Jane","Brenda")) 

$obj | select male 

Frank John 
----- ---- 
    3 5 
+1

Graimer, ваш ответ заполнен, подробно, до точки и больше, чем я даже просил. Вы сделали мой день! Теперь он отлично работает. Жаль, что я не могу дважды проголосовать за ваш ответ :) – Joost

+1

Твой добрый комментарий более чем достаточно :-) –