以下是来自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)。
答案 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。