Domanda

stati di documentazione:

  

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

Quello che "Windows PowerShell oggetto" sta per?

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].

È stato utile?

Soluzione

PowerShell ha quello che è chiamato un PSObject che è un wrapper intorno a qualsiasi oggetto .NET (o può essere un oggetto del tutto personalizzato) e quando si chiama Add-Member, PowerShell è implicitamente avvolgendo l'oggetto reale .NET con un PSObject.

Il modo in cui funziona Add-Member dipende da se o non si è iniziato con un PSObject. Se non si inizia con un PSObject, Add-Member avvolgerà l'ingresso in un PSObject e avrete bisogno di ri-assegnare la variabile al fine di 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-Stati fa avvolgerlo ma che involucro è perso perché non siete ri-assegnazione di $ x all'oggetto avvolto. 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 chiamata Add-Member è l'aggiunta di membri al involucro 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é Hashtables sono trattati speciale PowerShell e fondamentalmente l'adattatore per Hashtables utilizza le chiavi come proprietà (un pò) e Add-membro non sarà funzionare come previsto con questo tipo di oggetto.

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