0

当创建和使用 PSCustomObjects 导致 NoteProperty 成员具有“定义”(如下所示)时,是否有任何简单的编程方法可以从定义字段中选择值而不诉诸拆分字符串?

例如下面,是否有一种“好”的方法可以从不需要传统字符串操作的名称“token”字段中提取值“silver”?我一直在搞乱 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

谢谢。

更新:按照 Thomas 的指导,我想出了这个函数来从 PSObject 中提取 Noteproperty 成员并返回一个带有字段名称和值的 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
}

谢谢!

4

2 回答 2

3

您可以像访问任何其他对象一样访问自定义对象的成员:

$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
于 2020-05-10T11:19:27.477 回答
1

由于在您的对象中存储了一个字符串值,因此我看不到其他方法可以仅提取该值,silver然后使用字符串方法仅获取等号之后的部分。

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

为什么不使用额外的属性创建自定义对象,value并添加您在其中寻找的值,取自该Definition属性?喜欢

$obj = [PsCustomObject]@{'token' = 'string token=silver'; 'value' = 'silver'}
于 2020-05-10T11:23:50.340 回答