Определите пользовательские наборы свойств (с 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