Pouvez-vous mettre DefaultDisplayPropertySet d'un objet dans un script v2 PowerShell?

StackOverflow https://stackoverflow.com/questions/1369542

  •  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).

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top