Si può impostare DefaultDisplayPropertySet di un oggetto in uno script PowerShell v2?

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

  •  21-09-2019
  •  | 
  •  

Domanda

Ecco un post sul blog da Kirk Munro che spiega come uno script può impostare il DefaultDisplayPropertySet sui suoi oggetti di output:

PowerShell essenziale: Definizione di default proprietà per oggetti personalizzati

La sua tecnica e il codice di esempio non sembra funzionare in PowerShell v2. (Nota, ho PowerTab e PSCX installati -. Forse quelli potrebbero interferire)

Qualcuno sa come ottenere questo per lavorare su PowerShell v2?


AGGIORNARE: Ecco l'esempio il post sul blog, che non sta funzionando per me (nota, ho corretto i singoli caratteri virgolette):

$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

L'uscita non deve essere la stessa dopo l'aggiunta DefaultDisplayPropertySet (cioè, dovrebbe avere solo Nome, Property2 e Property4).

È stato utile?

Soluzione

Si può dare un esempio del codice non-lavoro? Questo dovrebbe funzionare perfettamente in v2, se non, avete trovato un bug.

UPDATE:

(commenti rimossi circa citando)

Ho confermato con la squadra PowerShell che questa è davvero una regressione (bug).

Puoi votare l'importanza del problema per voi qui:

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

Grazie,

-Oisin (Powershell MVP)

Altri suggerimenti

Ecco una soluzione che ho creato per risolvere questo problema:

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
}

}

Ora è possibile utilizzare il seguente per creare l'oggetto personalizzato e impostare le proprietà di default a 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

E 'anche disponibile tramite PoshCode: Set-PSObjectDefaultProperties

ottengo gli stessi risultati come si fa - visualizza tutte le 5 proprietà. Io corro PowerShell 2.0 RC su Vista. Non ho PowerTab o PSCX installati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top