Können Sie richten eine DefaultDisplayPropertySet des Objekts in einer v2 Skript Powershell?
-
21-09-2019 - |
Frage
Hier ist eine Blog-Post von Kirk Munro, der erklärt, wie ein Skript kann die DefaultDisplayPropertySet an seinem Ausgang gesetzt Objekte:
Wesentliche Powershell: Definieren Sie Standard Eigenschaften für benutzerdefinierte Objekte
Seine Technik und Beispiel-Code erscheint nicht zur Arbeit in Powershell v2. (Beachten Sie, habe ich PowerTab und PSCX installiert -. Vielleicht diejenigen stören könnte)
Wer weiß, wie dies zur Arbeit kommen auf Powershell v2?
AKTUALISIEREN: Hier ist das Beispiel aus der Blog-Post, die nicht für mich arbeiten (beachten Sie, habe ich die Apostrophe korrigiert):
$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
Die Ausgabe sollte nicht gleich sein nach der Zugabe von DefaultDisplayPropertySet (das heißt, es nur Namen haben sollte, Property2 und property4).
Lösung
Können Sie ein Beispiel für Ihre nicht-funktionierenden Code? Dies sollte perfekt in v2 arbeiten, wenn nicht, Sie einen Fehler gefunden haben.
UPDATE:
(entfernt Kommentare zu zitieren)
Ich habe mit dem Powershell-Team bestätigt, dass dies in der Tat eine Regression (Bug).
Sie können sich auf die Bedeutung der Frage stimmen Sie hier:
https://connect.microsoft.com/PowerShell/feedback/ ViewFeedback.aspx? FeedbackID = 487.938
Danke,
-Oisin (Powershell MVP)
Andere Tipps
Hier ist eine Lösung, die ich an der Arbeit, um dieses Problem geschaffen:
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
}
}
Nun können Sie mit dem folgenden Ihrer benutzerdefinierten Objekt zu erstellen und die Standardeigenschaften in Powershell V2 gesetzt:
$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
Es ist auch über PoshCode zur Verfügung: Set-PSObjectDefaultProperties
ich die gleichen Ergebnisse erhalten, wie Sie tun - es zeigt alle 5 Eigenschaften. Ich bin mit Powershell 2.0 RC auf Vista. Ich habe nicht PowerTab oder PSCX installiert.