2009-09-02 12 views
7

Oto blogu z Munro Kirk, który wyjaśnia, w jaki sposób skrypt może ustawić DefaultDisplayPropertySet na jego obiektów wyjściowych:Czy można ustawić obiekt DefaultDisplayPropertySet w skrypcie PowerShell v2?

Essential PowerShell: Define default properties for custom objects

Jego technika i przykładowy kod nie pojawi się do pracy w PowerShell v2. (Uwaga: Mam zainstalowane PowerTab i PSCX - być może te mogą przeszkadzać).

Ktoś wie, jak uruchomić to w PowerShell v2?


UPDATE: Oto przykład z blogu, który nie działa dla mnie (uwaga, mam Poprawiono pojedyńczych cudzysłowów):

$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 

wyjście nie powinno być to samo po dodaniu DefaultDisplayPropertySet (tzn. powinien mieć tylko nazwę, właściwość2 i właściwość4).

+0

I s należy również zauważyć, że używam PowerShell v2 w systemie Vista, za pośrednictwem 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

Odpowiedz

6

Czy możesz podać przykład swojego niedziałającego kodu? To powinno działać idealnie w wersji 2, jeśli nie, znalazłeś błąd.

UPDATE:

(usunięte komentarze o cytowanie)

Ustaliliśmy z zespołem PowerShell, że jest to rzeczywiście regresji (bug).

Można głosować na znaczeniu Emisja do was tutaj:

https://connect.microsoft.com/PowerShell/feedback/ViewFeedback.aspx?FeedbackID=487938

Dzięki,

-Oisin (PowerShell MVP)

+0

Miałem zauważyłem już nieprawidłowe znaki pojedynczego i podwójnego cudzysłowu i poprawiłem je. Dodałem rzeczywisty przykładowy kod do pierwotnego pytania. Czy Ci to pasuje? – totorocat

+0

Korekta: to był tylko pojedynczy cudzysłów. – totorocat

+0

zaktualizowana odpowiedź: to błąd w wersji 2.0 – x0n

0

uzyskać takie same wyniki, jak to zrobić - wyświetla wszystkie 5 właściwości. Używam Powershell 2.0 RC w systemie Vista. Nie mam zainstalowanych PowerTab lub PSCX.

+0

Dziękuję za poświęcenie czasu na potwierdzenie problemu ... – totorocat

2

Oto rozwiązanie stworzyłem aby obejść ten problem:

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 
} 

}

Teraz można użyć następujących czynności, aby stworzyć swój własny obiekt i ustawić domyślne właściwości w 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 

jest on również dostępny poprzez PoshCode: Set-PSObjectDefaultProperties

+0

Twój przykładowy kod zadziałał, ale niestety to podejście nie zadziałało w moim projekcie (którym jest PowerShell v3.0). To, co zrobiłeś, jest sprytne - funkcja zastępuje domyślne formatowanie dla obiektu PSCustomObject. Ale mam kilka obiektów, które wynikają z tego. Prawdopodobnie zakończę pisanie niektórych plików ps1xml. +1 za zmuszanie mnie do nauki. – JamesQMurphy

+0

Rozważmy tutaj ciąg znaków, zamiast konkatenować w ten sposób. – jpmc26