Powershell PSCustomObject Извлечение значений

При создании и работе с PSCustomObjects, которые приводят к члену NoteProperty с «определением» (как показано ниже), существует ли какой-либо простой программный способ выбора значений из полей определения, не прибегая к разделению строк?

Например, ниже, существует ли «хороший» способ извлечь значение «серебро» из поля имени «токен», которое не требует традиционных манипуляций со строками? Я возился с select и -ExpandProperty, но быстро не получал и был бы признателен за толчок в правильном направлении.

TypeName: System.Management.Automation.PSCustomObject
Name   MemberType   Definition          
----   ----------   ----------          
bsw    NoteProperty decimal bsw=3.14    
name   NoteProperty string name=chris
token  NoteProperty string token=silver 
volume NoteProperty decimal volume=17.22

Спасибо.

Обновление: следуя указаниям Томаса, я придумал эту функцию для извлечения членов Noteproperty из объекта PSObject и возврата Hashtable с именами полей и значениями:

function convertObjectToHash($psObj) {
    $hashBack = @{}

    try {
        $psObjFieldNames = $psObj | get-member -type NoteProperty | select "Name"
        $psObjFieldNames | foreach-object { 
            $hashBack.Add($_.Name,$psObj.$($_.Name)) }
        }catch{ "Error: $_" }

    return $hashBack
}

Спасибо!


person Indrid    schedule 10.05.2020    source источник
comment
Вы можете показать нам JSON, который нужно преобразовать?   -  person Theo    schedule 10.05.2020


Ответы (2)


Вы можете получить доступ к членам настраиваемого объекта, как и к любому другому объекту:

$myCustomObject.token

Воспроизведение:

$myCustomObject = New-Object -TypeName psobject
$myCustomObject | Add-Member -MemberType NoteProperty -Name bsw -Value 3.14
$myCustomObject | Add-Member -MemberType NoteProperty -Name name -Value "chris"
$myCustomObject | Add-Member -MemberType NoteProperty -Name token -Value "silver"
$myCustomObject | Add-Member -MemberType NoteProperty -Name volume -Value 17.22

$myCustomObject | Get-Member -MemberType NoteProperty
$myCustomObject.token

Выход:

   TypeName: System.Management.Automation.PSCustomObject

Name   MemberType   Definition                
----   ----------   ----------                
bsw    NoteProperty System.Double bsw=3.14    
name   NoteProperty string name=chris         
token  NoteProperty string token=silver       
volume NoteProperty System.Double volume=17.22

silver
person stackprotector    schedule 10.05.2020
comment
Спасибо, Томас. Этот метод, вероятно, мой лучший шанс попасть туда, где мне нужно быть. Я действительно получаю поля из документа Json. По умолчанию объект, который я получаю после convertfrom-json, имеет дискретные поля, к которым я могу получить доступ по имени, но не по значениям. Ваш метод потребует немного большей подготовки, но я уверен, что он сработает. Большое спасибо! - person Indrid; 10.05.2020
comment
@Indrid Как вы тогда получили ответ в своем вопросе? Это не выглядит так сложно, как вы описываете. - person stackprotector; 10.05.2020
comment
Спасибо, Томас. Я начал с получения содержимого из локального файла json, который содержит массив элементов. У меня нет возможности узнать, какие имена полей будут в каждом элементе, кроме трех, которые являются постоянными. Затем я выполнил convertfrom-json и, поскольку я не видел возможности взаимодействовать с именами полей, которые были найдены (только значениями), я сделал конвейер для get-member -membertype noteproperty. Это дало мне доступ к именам полей через .Name. Мне также нужно значение, которое я мог видеть в .Definition, но не мог понять, как получить только значение без строковых операций. - person Indrid; 10.05.2020
comment
Опираясь на ваш пример и вводные данные, а также для потомков, я создал эту функцию для преобразования элементов PSObject Noteproperty в HashTable. Я помещу функцию в основной вопрос. Все это мне нужно для того, чтобы указать параметры в командлете add-pnpField .... - person Indrid; 10.05.2020

Поскольку в ваших объектах вы храните строковое значение, я не вижу другого способа извлечь только значение silver, а затем использовать строковый метод, чтобы получить только часть после знака равенства.

($obj.token -split '=', 2)[-1]  --> silver

Почему бы не создать настраиваемые объекты с дополнительным свойством value и не добавить туда искомое значение, взятое из свойства Definition? нравиться

$obj = [PsCustomObject]@{'token' = 'string token=silver'; 'value' = 'silver'}
person Theo    schedule 10.05.2020