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.
Grazie per la spiegazione! – alex2k8