2009-09-02 95 views
7

这里是柯克·蒙罗博客文章,解释脚本如何设置DefaultDisplayPropertySet其输出对象:您可以在PowerShell v2脚本中设置对象的DefaultDisplayPropertySet吗?

Essential PowerShell: Define default properties for custom objects

他的技术和示例代码没有出现在PowerShell中V2工作。 (注意,我安装了PowerTab和PSCX - 可能这些可能会造成干扰)。

任何人都知道如何让它在PowerShell v2上运行?


UPDATE: 下面是从博客文章,这不是为我工作(注意,我已经纠正了单引号字符)的例子:

$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)相同。

+0

I S还应该注意到,我正在Vista上运行PowerShell v2,通过Microsoft Windows Management Framework RC。 http://blogs.msdn.com/powershell/archive/2009/08/14/powershell-2-0-for-windows-vista-and-windows-server-2008-release-candidate.aspx – totorocat 2009-09-02 21:46:37

回答

6

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

UPDATE:

(约引用删除评论)

我已经证实了PowerShell的团队,这的确是一个回归(错误)。

你可以在这个问题上的重要性在这里投票给你:

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

感谢,

-Oisin (PowerShell的MVP)

+0

我有已经注意到无效的单引号和双引号字符,并对其进行了修正我已将实际示例代码添加到原始问题中。对你起作用吗? – totorocat 2009-09-02 21:40:48

+0

更正:它只是单引号字符。 – totorocat 2009-09-02 21:48:09

+0

更新回答:这是一个在2.0版中的错误 – x0n 2009-09-03 17:50:31

0

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

+0

感谢您花时间确认问题... – totorocat 2009-09-04 02:25:16

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

+0

您的示例代码适用于我,但唉,此方法在我的项目(即PowerShell v3.0)中无效。你所做的很聪明 - 该函数替换PSCustomObject的默认格式。但是我有一些由此衍生出来的物体。我可能会结束写一些ps1xml文件。 +1让我学到东西。 – JamesQMurphy 2015-01-24 19:03:29

+0

考虑一个here-string而不是像这样连接。 – jpmc26 2016-06-15 23:41:41

相关问题