2009-09-02 6 views
7

Voici un blog de Kirk Munro qui explique comment un script peut définir la DefaultDisplayPropertySet sur ses objets de sortie:Pouvez-vous définir DefaultDisplayPropertySet d'un objet dans un script PowerShell v2?

Essential PowerShell: Define default properties for custom objects

Sa technique et exemple de code ne semble pas travailler dans v2 PowerShell. (Remarque, PowerTab et PSCX sont installés - peut-être que ceux-ci pourraient interférer.)

Quelqu'un sait comment faire fonctionner cela sur PowerShell v2?


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 même après avoir ajouté DefaultDisplayPropertySet (c'est-à-dire, il ne devrait avoir que Name, Property2 et Property4).

+0

I s Je voudrais également noter que je cours PowerShell v2 sur Vista, via le 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

Répondre

6

Pouvez-vous donner un exemple de code non fonctionnel? Cela devrait fonctionner parfaitement dans v2, sinon, vous avez trouvé un bug.

MISE À JOUR:

(commentaires supprimés au sujet de citer)

J'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)

+0

J'avais déjà remarqué les caractères de guillemets simples et doubles invalides et les a corrigés. J'ai ajouté l'exemple de code à la question d'origine. Est-ce que ça marche pour toi? – totorocat

+0

Correction: c'était juste des guillemets simples. – totorocat

+0

mise à jour répondre: c'est un bug dans v2.0 – x0n

0

Je reçois les mêmes résultats que vous faites - il affiche les 5 propriétés. Je cours Powershell 2.0 RC sur Vista. Je n'ai pas PowerTab ou PSCX installé.

+0

Merci d'avoir pris le temps de confirmer le problème ... – totorocat

2

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

+0

Votre exemple de code a fonctionné pour moi, mais hélas, cette approche n'a pas fonctionné dans mon projet (qui est PowerShell v3.0). Ce que vous avez fait est intelligent - la fonction remplace la mise en forme par défaut pour le PSCustomObject. Mais j'ai quelques objets qui en découlent. Je finirai probablement par écrire quelques fichiers ps1xml à la place. +1 pour m'avoir appris quelque chose. – JamesQMurphy

+0

Considérons une chaîne ici au lieu de concaténer comme ça. – jpmc26