您可以在PowerShell v2脚本中设置对象的DefaultDisplayPropertySet吗?

时间:2009-09-02 19:02:52

标签: powershell powershell-v2.0

以下是来自Kirk Munro的博客文章,其中解释了脚本如何在其输出对象上设置DefaultDisplayPropertySet:

Essential PowerShell: Define default properties for custom objects

他的技术和示例代码似乎在PowerShell v2中不起作用。 (注意,我安装了PowerTab和PSCX - 也许那些可能会干扰。)

任何人都知道如何在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')
$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 个答案:

答案 0 :(得分:6)

您能举例说明您的非工作代码吗?这应该在v2中完美运行,如果没有,你发现了一个bug。

更新:

(删除了关于引用的评论)

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

您可以在此投票决定问题对您的重要性:

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

谢谢,

-Oisin (powershell MVP)

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

我得到与你相同的结果 - 它显示所有5个属性。我在Vista上运行Powershell 2.0 RC。我没有安装PowerTab或PSCX。