Können Sie richten eine DefaultDisplayPropertySet des Objekts in einer v2 Skript Powershell?

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

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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top