2009-04-28 5 views
6

문서 상태 :Add-Member에는 어떤 객체가 적합합니까?

는 에 사용자가 정의한 사용자 지정 멤버에게 Windows PowerShell을 객체의 인스턴스를 추가합니다.

"Windows PowerShell 개체"의 약자는 무엇입니까?

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

을하지만 그렇지 않은 :

이 잘 작동

$obj = @{} 

를 사실, 난 $ 오류에 속성을 추가하려합니다 [0].

답변

16

PowerShell에는 .NET 개체 (또는 완전히 사용자 지정 개체 일 수 있음) 주위의 래퍼 인 PSObject가 있으며 추가 구성원을 호출하면 PowerShell은 실제 .NET 개체를 암시 적으로 PSObject로 래핑합니다.

Add-Member 작동 방식은 PSObject로 시작했는지 여부에 달려 있습니다. PSObject로 시작하지 않은 경우, Add-Member는 입력을 PSObject에 랩핑하고 해당 객체를보기 위해 변수를 다시 할당해야합니다. 그래서 예를 들면

는 : OSVERSION가 PSObject입니다 포장되지 않기 때문에

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

이다. Add-Member가 래핑하지만 래핑 된 객체에 $ x를 다시 할당하지 않기 때문에 해당 래퍼가 손실됩니다. 이 동작과 대조 :

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

이는 새 개체가 암시 적으로 PSObject에 새 인스턴스를 래핑하기 때문입니다. 따라서 Add-Member 호출은 기존 래퍼에 멤버를 추가하는 것입니다. Hashtable의 당신이 있기 때문입니다 예상대로 작동하지 않습니다, 모든 후 지금

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

이유 : 첫 번째 예제로 돌아 간다

, 당신은 그것을 변경하여이 예상대로 작동 할 수 있습니다 Hashtables는 PowerShell에서 특별하게 취급되며 기본적으로 Hashtables 용 어댑터는 키를 속성으로 사용하며 (예 : 일부) Add-Member는 이러한 종류의 개체에서 예상대로 작동하지 않습니다.

+0

설명해 주셔서 감사합니다. – alex2k8

관련 문제