【问题标题】:Iterate Sub properties of PowerShell Objects迭代 PowerShell 对象的子属性
【发布时间】:2013-02-12 19:28:52
【问题描述】:
PS C:\> $array

ReadWrite(AllHostsSpecified) : 
ReadOnly(AllHostsSpecified)  : 
ReadWrite(NegateSpecified)   : 
ReadWrite(Negate)            : 
SecFlavor                    : sys
ActualPathname               : 
ReadOnly(AllHosts)           : 
ReadOnly(Name)               : 
ReadWrite(Name)              : 
Anon                         : 
Root                         : {vin1,vin2,vin3,vin4...}
ReadOnly(NegateSpecified)    : 
ReadWrite(AllHosts)          : 
NosuidSpecified              : False
Nosuid                       : 
ReadOnly(Negate)             : 
Pathname                     : /vol/vin_binaries

大家好,我有属性根,它是一个动态属性,可以从 (vin1,vin2,vin3,vin4.......) 变化,甚至可以无穷无尽。

现在,当我执行导出 csv 时,我需要获取如下输出对象

ReadWrite(AllHostsSpecified) : 
ReadOnly(AllHostsSpecified)  : 
ReadWrite(NegateSpecified)   : 
ReadWrite(Negate)            : 
SecFlavor                    : sys
ActualPathname               : 
ReadOnly(AllHosts)           : 
ReadOnly(Name)               : 
ReadWrite(Name)              : 
Anon                         : 
Root (Property 1)                         : vin1
Root (Property 1)                         : vin2
Root (Property 1)                         : vin3
Root (Property 1)                         : vin4
.
.
.
.

Root (Property n)                         : vinn

ReadOnly(NegateSpecified)    : 
ReadWrite(AllHosts)          : 
NosuidSpecified              : False
Nosuid                       : 
ReadOnly(Negate)             : 
Pathname                     : /vol/vin_binaries

有没有办法做到这一点?就像在 for 循环中迭代 Root 的所有属性???

【问题讨论】:

    标签: arrays powershell


    【解决方案1】:

    试试这样的:

    filter ExpandProperties {
        $obj = $_
        $obj | gm -MemberType *property | % {
            #Find objects with array value
            if( @($obj.($_.Name)).Count -gt 1 ) {
                $count = 1
                $prop = $_.Name
                $obj.($prop) | % {
                    #Foreach value in the property
                    $obj | Add-Member NoteProperty -Name "$prop (Property $($count))" -Value $_
                    $count++
                }
            }
        }
        #Output object
        $obj
    }
    
    $o1 = New-Object psobject -Property @{
        Name = @("Name1", "Name2")
        Root = @("vin1","vin2")
    }
    $o2 = New-Object psobject -Property @{
        Name = "Name2"
        Root = @("vin1","vin2","vin3")
    }
    $o = $o1, $o2
    
    $o | ExpandProperties
    
    
    Name              : {Name1, Name2}
    Root              : {vin1, vin2}
    Name (Property 1) : Name1
    Name (Property 2) : Name2
    Root (Property 1) : vin1
    Root (Property 2) : vin2
    
    Name              : Name2
    Root              : {vin1, vin2, vin3}
    Root (Property 1) : vin1
    Root (Property 2) : vin2
    Root (Property 3) : vin3
    

    这也显示了原始数组属性(例如“Root”)。如果要排除它,需要在函数内部使用select -exclude ...。但是,这会创建一个新的“pscustomobject”(您会丢失原始对象类型),因此我没有将其包含在上面的解决方案中。

    【讨论】:

    • 嗨 Graimer,感谢您的回复,但我想在运行中完成它.. 使用 $array 的输出
    • 您不能即时进行。 PowerShell 使用数组来收集多个对象/值。您需要创建一个“过滤器”来完成这项工作。我的适用于您的情况,但转换代码以检测和扩展所有分组属性应该不难。我没有可用的 powershell atm 来自己转换它。
    • 忽略第一行,忘记删除它们。要使用数组扩展每个属性,您需要创建一个使用“get-member”获取属性的“过滤器”,然后使用 ex. “计数”只获取具有数组值的道具,然后使用我的循环来展开所有道具
    • 你能分享一下怎么做吗?
    猜你喜欢
    • 2016-02-26
    • 2023-03-24
    • 2021-12-04
    • 1970-01-01
    • 2010-10-03
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多