2009-04-28 13 views
6

stati di documentazione:Quali oggetti sono adatti per Add-Member?

Aggiunge un membro personalizzato definito dall'utente a un'istanza di un oggetto di Windows PowerShell.

Che cosa significa "Oggetto Windows PowerShell"?

Questo funziona bene:

$obj = new-object system.object 
$obj | add-member -membertype noteproperty -name Name -value "OK" 
$obj.name 

Ma questo non lo fa:

$obj = @{} 

In realtà, io sto cercando di aggiungere proprietà per $ error [0].

risposta

16

PowerShell ha un cosiddetto PSObject che è un wrapper attorno a qualsiasi oggetto .NET (oppure può essere un oggetto completamente personalizzato) e quando si chiama Add-Member, PowerShell avvolge implicitamente l'oggetto .NET reale con un oggetto PSObject.

Il modo in cui Add-Member funziona dipende dall'avvio o meno di un oggetto PSObject. Se non hai iniziato con un PSObject, Add-Member inserirà l'input in un oggetto PSO e dovrai riassegnare la variabile per vedere l'oggetto adattato.

Così, per esempio:

$x = [Environment]::OSVersion 
$x | Add-Member NoteProperty IsVista $true 
$x | Format-List # does not show the new property 

Questo perché OSVersion Non è avvolto è un PSObject. Add-Member lo avvolge ma quel wrapper è perso perché non stai riassegnando $ x all'oggetto spostato. Contrasto con questo comportamento:

$x = New-Object OperatingSystem ('Win32NT', '6.0') 
$x | Add-Member NoteProperty IsVista $true 
$x | Format-List # DOES show the new property 

Questo perché New-Object avvolge implicitamente la nuova istanza in un PSObject. Quindi la tua chiamata Aggiungi membro sta aggiungendo membri al wrapper esistente.

Tornando al primo esempio, è possibile farlo funzionare come previsto, modificando a:

$x = [Environment]::OSVersion 
$x = $x | Add-Member NoteProperty IsVista $true -PassThru 
$x | Format-List # DOES show the new property 

Ora, dopo tutto questo, il motivo per cui il Hashtable non funziona nel modo previsto perché Gli hashtables sono trattati in modo speciale da PowerShell e fondamentalmente l'adattatore per Hashtables utilizza le chiavi come proprietà (kinda) e Add-Member non funzionerà come previsto con questo tipo di oggetto.

+0

Grazie per la spiegazione! – alex2k8

Problemi correlati