Pouvez-vous mettre DefaultDisplayPropertySet d'un objet dans un script v2 PowerShell?
-
21-09-2019 - |
Question
Voici un blog de Kirk Munro qui explique comment un script peut définir la DefaultDisplayPropertySet sur ses objets de sortie:
Essential PowerShell: Définir défaut propriétés pour les objets personnalisés
Sa technique et exemple de code ne semble pas travailler dans v2 PowerShell. (Note, je PowerTab et PSCX installés -. Peut-être celles-ci pourraient interférer)
Quelqu'un sait comment obtenir ce travail sur v2 PowerShell?
MISE À JOUR: Voici l'exemple du billet de blog, qui ne fonctionne pas pour moi (note, je l'ai corrigé les guillemets simples):
$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
La sortie ne doit pas être le même après avoir ajouté DefaultDisplayPropertySet (à savoir, il ne doit avoir le nom, Propriété2 et property4).
La solution
Pouvez-vous donner un exemple de code non-travail? Cela devrait fonctionner parfaitement dans v2, sinon, vous avez trouvé un bug.
Mise à jour:
(les commentaires supprimés au sujet de citer)
Je l'ai confirmé avec l'équipe powershell que c'est en effet une régression (bug).
Vous pouvez voter pour vous sur l'importance de la question ici:
https://connect.microsoft.com/PowerShell/feedback/ ViewFeedback.aspx? FeedbackID = 487938
Merci,
-Oisin (Powershell MVP)
Autres conseils
Voici une solution que j'ai créé pour contourner ce problème:
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
}
}
Maintenant, vous pouvez utiliser les éléments suivants pour créer votre objet personnalisé et définissez les propriétés par défaut dans 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
Il est également disponible via PoshCode: Set-PSObjectDefaultProperties
Je reçois les mêmes résultats que vous faites - il affiche les 5 propriétés. Je suis en cours d'exécution Powershell 2.0 RC sur Vista. Je n'ai pas PowerTab ou PSCX installé.