8

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

基本 PowerShell:定义自定义对象的默认属性

他的技术和示例代码似乎不适用于 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)。

4

3 回答 3

6

你能举一个你的非工作代码的例子吗?这在 v2 中应该可以完美运行,如果没有,您已经发现了一个错误。

更新:

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

我已经与 powershell 团队确认这确实是一个回归(错误)。

您可以在此处就该问题对您的重要性进行投票:

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

谢谢,

-Oisin(powershell MVP)

于 2009-09-02T21:16:51.220 回答
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

于 2009-12-11T22:13:03.747 回答
0

我得到了和你一样的结果——它显示了所有 5 个属性。我在 Vista 上运行 Powershell 2.0 RC。我没有安装 PowerTab 或 PSCX。

于 2009-09-03T15:28:53.130 回答