【问题标题】:Powershell PSCustomObject Extracting valuesPowershell PSCustomObject 提取值
【发布时间】:2020-08-25 21:08:17
【问题描述】:

当创建和使用 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
}

谢谢!

【问题讨论】:

  • 你能告诉我们你需要转换的 JSON 吗?

标签: powershell pscustomobject


【解决方案1】:

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

$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

【讨论】:

  • 谢谢托马斯。该方法可能是我到达我需要的地方的最佳机会。我实际上是从 Json 文档中获取字段。默认情况下,我在 convertfrom-json 之后得到的对象具有我可以访问的离散字段 name ,但不是值。你的方法需要更多的准备,但我确信它会奏效。非常感谢!
  • @Indrid 那么您是如何获得问题中的输出的呢?看起来没有你描述的那么复杂。
  • 谢谢Thomas 我首先从本地json 文件中获取内容,该文件包含一系列项目。除了大约三个不变的字段名称外,我无法知道每个项目中将包含哪些字段名称。然后我做了一个convertfrom-json,因为我看不到与找到的字段名称(只是值)交互的方法,所以我做了管道到get-member -membertype“noteproperty”。这样做使我可以通过“.Name”访问字段名称。我还需要值,我可以在 .Definition 中看到它 - 但无法弄清楚如何在没有字符串操作的情况下仅获取值。
  • 在您的示例和输入的基础上,为了后代,我制作了这个函数来将 PSObject Noteproperty 项目转换为 HashTable。我将把函数放入主要问题主体。我需要所有这些才能在 add-pnpField cmdlet 中添加参数....
【解决方案2】:

由于在您的对象中存储了一个字符串值,我认为没有其他方法可以仅提取值 silver 然后使用字符串方法仅获取等号后面的部分。

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

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

$obj = [PsCustomObject]@{'token' = 'string token=silver'; 'value' = 'silver'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2016-06-23
    • 2021-07-04
    • 1970-01-01
    • 2021-08-31
    • 2017-12-01
    相关资源
    最近更新 更多