代码之家  ›  专栏  ›  技术社区  ›  Eric Schoonover thSoft

PowerShell向数组项添加成员

  •  4
  • Eric Schoonover thSoft  · 技术社区  · 15 年前

    我正在尝试对数组中的所有项使用powershell add member命令,然后访问稍后添加的成员,但它没有显示。

    您可以在下面代码的输出中看到,noteproperty似乎存在于foreach语句的作用域内,但它不存在于该作用域之外的同一对象上。

    任何让这个脚本显示的方法 isPrime 两个电话都要联系会员?

    $p = @(1)
    $p[0] | %{ add-member -inputobject $_ -membertype noteproperty -name isPrime -value $true; $_ | gm }
    $p[0] | gm
    

    输出

       TypeName: System.Int32
    
    Name        MemberType   
    ----        ----------   
    CompareTo   Method       
    Equals      Method       
    GetHashCode Method       
    GetType     Method       
    GetTypeCode Method       
    ToString    Method       
    isPrime     NoteProperty 
    
    
    CompareTo   Method      
    Equals      Method      
    GetHashCode Method      
    GetType     Method      
    GetTypeCode Method      
    ToString    Method 
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   Keith Hill    15 年前

    您遇到的问题是1,一个整数,是.NET中的一个值类型,当它被传递时,它会被复制(传递值)。因此,您成功地修改了1的副本,而不是数组中的原始副本。如果将1装箱(或强制转换)到对象(引用类型),则可以看到此情况,例如:

    $p = @([psobject]1)
    $p[0] | %{ add-member NoteProperty isPrime $true; $_ | gm }
    $p[0] | gm
    

    op(spoon16)答案

    这就是我脚本中的代码最终是如何查找的。如果可以优化,请随意编辑。

    $p = @() #declare array
    2..$n | %{ $p += [psobject] $_ } #initialize
    $p | add-member -membertype noteproperty -name isPrime -value $true
    
        2
  •  2
  •   Doug Finke    15 年前

    我会通过输入更少来优化:

    $p | add-member noteproperty isPrime $true