2009-04-28 16 views
6

Dokumentacja stany:Jakie obiekty są odpowiednie dla Add-Member?

Dodaje niestandardowej członkiem zdefiniowanej przez użytkownika do instancję Windows PowerShell obiektu.

Co oznacza "obiekt Windows PowerShell"?

Działa to dobrze:

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

Ale tego nie robi:

$obj = @{} 

Właściwie Próbuję dodać obiekt do $ błędu [0].

Odpowiedz

16

PowerShell ma tak zwany obiekt PSObject, który jest opakowaniem dowolnego obiektu .NET (lub może być całkowicie niestandardowym obiektem), a po wywołaniu elementu Add-Member program PowerShell niejawnie zawija rzeczywisty obiekt .NET za pomocą obiektu PSObject.

Sposób działania przycisku Add-Member zależy od tego, czy rozpocząłeś od obiektu PSObject. Jeśli nie zacząłeś od PSObject, Add-Member zawinie wejście w PSObject i będziesz musiał ponownie przypisać zmienną, aby zobaczyć dostosowany obiekt.

Tak na przykład:

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

To dlatego wersja_systemu_operacyjnego nie jest owinięty jest PSObject. Add-Member owija go, ale opakowanie jest tracone, ponieważ nie przypisujesz ponownie $ x do owiniętego obiektu. Porównaj to zachowanie:

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

Dzieje się tak dlatego, że New-Object niejawnie opakowuje nową instancję w obiekcie PSO. Tak więc Twoje połączenie z Add-Member dodaje członków do istniejącego opakowania.

Wracając do pierwszego przykładu, możesz zrobić to działa zgodnie z oczekiwaniami, zmieniając go do:

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

teraz, po tym wszystkim, z powodu, że Hashtable nie działa zgodnie z oczekiwaniami, ponieważ jest Hashtables są traktowane specjalnie przez PowerShell i zasadniczo adapter dla Hashtables używa kluczy jako właściwości (kinda), a Add-Member nie będzie działać zgodnie z oczekiwaniami dla tego rodzaju obiektu.

+0

Dziękuję za wyjaśnienia! – alex2k8

Powiązane problemy