Определите пользовательские наборы свойств (с Add-Member?) Для использования в Select-Object

То, что я пытаюсь сделать, довольно просто: создать пользовательский объект с некоторыми свойствами, а затем определить "группы" свойств (столбцов) для использования в 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, и я читал на разных сайтах, что есть ошибка, которая не позволяет устанавливать свойства по умолчанию. Это не то, что я хочу сделать - я хочу создать собственный набор свойств, а не набор по умолчанию - но возможно, что эта ошибка также мешает мне получить то, что я хочу.

1 ответ

Решение

Вы очень близки Проблема в том, что вы неправильно создаете объект. Вам необходимо указать -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

РЕДАКТИРОВАТЬ Решение выше работал только в PS3.0 . Это все еще действует, так как -Property Параметр также требуется в PS2.0. В PS2.0 вам нужно привести массив-набор-свойств к string[] (массив строк), а не массив объектов (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
Другие вопросы по тегам