代码之家  ›  专栏  ›  技术社区  ›  totorocat

能否在PowerShell v2脚本中设置对象的DefaultDisplayPropertySet?

  •  7
  • totorocat  · 技术社区  · 16 年前

    下面是Kirk Munro的一篇博文,解释了脚本如何在其输出对象上设置DefaultDisplayPropertySet:

    Essential PowerShell: Define default properties for custom objects

    他的技术和示例代码在PowerShell v2中似乎不起作用。(注意,我已经安装了PowerTab和PSCX——也许它们可能会造成干扰。)


    更新: 以下是博客文章中的示例,这对我不起作用(注意,我已经更正了单引号字符):
    $myObject = New-Object PSObject
    $myObject | Add-Member NoteProperty Name 'My Object'
    $myObject | Add-Member NoteProperty Property1 1
    $myObject | Add-Member NoteProperty Property2 2
    $myObject | Add-Member NoteProperty Property3 3
    $myObject | Add-Member NoteProperty Property4 4
    $myObject | Add-Member NoteProperty Property5 5
    $myObject
    
      ## Output:
      # Name      : My Object
      # Property1 : 1
      # Property2 : 2
      # Property3 : 3
      # Property4 : 4
      # Property5 : 5
    
    $defaultProperties = @('Name','Property2','Property4')
    $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$defaultProperties)
    $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
    $myObject | Add-Member MemberSet PSStandardMembers $PSStandardMembers
    $myObject
    
      ## Output:
      # Name      : My Object
      # Property1 : 1
      # Property2 : 2
      # Property3 : 3
      # Property4 : 4
      # Property5 : 5
    

    添加DefaultDisplayPropertySet后,输出不应该相同(即,它应该只有Name、Property2和Property4)。

    3 回复  |  直到 16 年前
        1
  •  6
  •   x0n    16 年前

    你能举一个非工作代码的例子吗?这在v2中应该可以很好地工作,如果没有,那么您已经发现了一个bug。

    更新:

    (删除了有关引用的注释)

    我已经向powershell团队确认,这确实是一个回归(bug)。

    你可以在这里就这个问题对你的重要性进行投票:

    https://connect.microsoft.com/PowerShell/feedback/ViewFeedback.aspx?FeedbackID=487938

    (powershell MVP)

        2
  •  2
  •   JamesQMurphy    11 年前

    以下是我为解决此问题而创建的解决方案:

    function Set-PSObjectDefaultProperties {
    param(
          [PSObject]$Object,
          [string[]]$DefaultProperties
         )
    
    $name = $Object.PSObject.TypeNames[0]     
    
    $xml = "<?xml version='1.0' encoding='utf-8' ?><Types><Type>"
    
    $xml += "<Name>$($name)</Name>"
    
    $xml += "<Members><MemberSet><Name>PSStandardMembers</Name><Members>"
    
    $xml += "<PropertySet><Name>DefaultDisplayPropertySet</Name><ReferencedProperties>"
    
    foreach( $default in $DefaultProperties ) {
        $xml += "<Name>$($default)</Name>"
    }
    
    $xml += "</ReferencedProperties></PropertySet></Members></MemberSet></Members>"
    
    $xml += "</Type></Types>"
    
    $file = "$($env:Temp)\$name.ps1xml"
    
    Out-File -FilePath $file -Encoding "UTF8" -InputObject $xml -Force
    
    $typeLoaded = $host.Runspace.RunspaceConfiguration.Types | where { $_.FileName -eq  $file }
    
    if( $typeLoaded -ne $null ) {
        Write-Verbose "Type Loaded"
        Update-TypeData
    }
    else {
        Update-TypeData $file
    }
    

    }

    现在,您可以使用以下命令在PowerShell V2中创建自定义对象并设置默认属性:

    $myObject = New-Object PSObject
    $myObject | Add-Member NoteProperty Name 'My Object'
    $myObject | Add-Member NoteProperty Property1 1
    $myObject | Add-Member NoteProperty Property2 2
    $myObject | Add-Member NoteProperty Property3 3
    $myObject | Add-Member NoteProperty Property4 4
    $myObject | Add-Member NoteProperty Property5 5
    $myObject
    
      ## Output:
      # Name      : My Object
      # Property1 : 1
      # Property2 : 2
      # Property3 : 3
      # Property4 : 4
      # Property5 : 5
    
    $defaultProperties = @('Name','Property2','Property4')
    
    Set-PSObjectDefaultProperties $myObject $defaultProperties
    
    $myObject
    
      ## Output:
      #Name            Property2          Property4
      #----            ---------          ---------
      #My Object       2                  4
    

    也可通过PoshCode获取: Set-PSObjectDefaultProperties

        3
  •  0
  •   fenster    16 年前

    推荐文章