sourcetip

PSObject, Hashtable 및 PSCustomObject 간의 차이

fileupload 2023. 8. 21. 21:33
반응형

PSObject, Hashtable 및 PSCustomObject 간의 차이

자세한 설명을 해주실 분 있나요?다음을 사용하여 개체를 만드는 경우

$var = [PSObject]@{a=1;b=2;c=3}

그리고 나서 저는 그것의 종류를 찾습니다.getType()PowerShell에서 해시 테이블 유형이라고 합니다.

Get-Member 사용 시(가칭)gm) 테이블이이에는 ) 개체검려해테생것분다이니명합성된이이시블사면하를▁a▁it▁)▁)▁has다table▁has니▁hash▁it▁inspect▁to▁object▁since,▁the. 해시 테이블에keys a 리고a.values테이블과 입니까?그렇다면 "일반" 해시 테이블과 다른 점은 무엇입니까?

또한 PSCustomObject를 사용하면 어떤 이점이 있습니까?이와 같은 것을 사용하여 하나를 만들 때

$var = [PSCustomObject]@{a=1;b=2;c=3}

나에게 눈에 보이는 유일한 차이점은 PSCustomObject의 데이터 유형이 다르다는 것입니다.또한 키 및 값 속성 대신 다음을 사용하여 검사합니다.gm이제 모든 키가 NoteProperty 개체로 추가되었음을 나타냅니다.

하지만 내게 어떤 장점이 있을까요?해시 테이블에서와 마찬가지로 키를 사용하여 값에 액세스할 수 있습니다.해시 테이블에서와 마찬가지로 PSCustomObject에도 단순 키-값 쌍(예: 키-객체 쌍) 이상을 저장할 수 있습니다.그래서 어떤 장점이 있을까요?중요한 차이점이 있습니까?

하나의 시나리오에서[PSCustomObject]는 대사다니됩용 됩니다.HashTable수집이 필요할 때입니다.다음은 처리 방법의 차이를 설명하기 위한 것입니다.

$Hash = 1..10 | %{ @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} }
$Custom = 1..10 | %{[PSCustomObject] @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} }

$Hash   | Format-Table -AutoSize
$Custom | Format-Table -AutoSize

$Hash   | Export-Csv .\Hash.csv -NoTypeInformation
$Custom | Export-Csv .\CustomObject.csv -NoTypeInformation

Format-Table 에대 다 과 결 같 니 가 과$Hash:

Name    Value
----    -----
Name    Object 1
Squared 1
Index   1
Name    Object 2
Squared 4
Index   2
Name    Object 3
Squared 9
...

그리고 다음은 다은음고에 입니다.$CustomObject:

Name      Index Squared
----      ----- -------
Object 1      1       1
Object 2      2       4
Object 3      3       9
Object 4      4      16
Object 5      5      25
...

에서 동일한 현상이 발생합니다.Export-Csv 따서사하이유는야해를 [PSCustomObject]한 단순한 것 HashTable.

폴더를 만들고 싶다고 합니다.PSO 객체를 사용하면 잘못된 것임을 확인할 수 있습니다.

PS > [PSObject] @{Path='foo'; Type='directory'}

Name                           Value
----                           -----
Path                           foo
Type                           directory

그러나 PSCustomObject는 올바르게 표시됩니다.

PS > [PSCustomObject] @{Path='foo'; Type='directory'}

Path                                    Type
----                                    ----
foo                                     directory

그러면 나는 그 물체를 파이프로 연결할 수 있습니다.

[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item

설명서에서 다음을 참조하십시오.

사용 가능한 구성원의 대체 보기와 확장 방법을 제공하는 개체를 래핑합니다.멤버는 메서드, 속성, 매개 변수화된 속성 등이 될 수 있습니다.

a 시말 서해다,, a입니다.PSObject메서드 및 속성을 만든 후에 추가할 수 있는 개체입니다.

해시 테이블 설명서에서 다음을 수행합니다.

사전 또는 연관 배열이라고도 하는 해시 테이블은 하나 이상의 키/값 쌍을 저장하는 압축 데이터 구조입니다.

...

해시 테이블은 데이터를 찾고 검색하는 데 매우 효율적이기 때문에 자주 사용됩니다.

를 사용할 수 있습니다.PSObject좋아해를Hashtable하면 PowerShell에 할 수 입니다.PSObjects하지만 당신은 이것을 하면 안 됩니다 왜냐하면 당신은 접근을 잃을 것이기 때문입니다.Hashtable 기능(예: 기과같특능정은Keys그리고.Values사용량이 .또한 성능 비용과 추가 메모리 사용량이 있을 수 있습니다.

PowerShell 설명서에는 다음 정보가 포함되어 있습니다.

매개 변수가 없는 PSObject의 생성자가 사용되는 경우 자리 표시자 기본 개체로 사용됩니다.

이것은 저에게 명확하지 않았지만, 많은 PowerShell 책의 공동 저자PowerShell 포럼에 올린 글이 더 명확해 보입니다.

[PSCustomObject]는 유형의 가속기입니다.PSO 개체를 구성하지만 해시 테이블 키가 속성이 되는 방식으로 구성됩니다.PSCustomObject는 개체 유형 자체가 아닙니다. 프로세스 바로 가기입니다. ...PSCustomObject는 생성자 매개 변수 없이 PSObject를 호출할 때 사용되는 자리 표시자입니다.

코드인 의코와관서해련드당에 는,@{a=1;b=2;c=3}입니다.Hashtable.[PSObject]@{a=1;b=2;c=3}변하지않다니를 하지 않습니다.HashtablePSObject또는 오류를 생성합니다.개체는 다음과 같이 유지됩니다.Hashtable .만지하,[PSCustomObject]@{a=1;b=2;c=3}을 합니다.Hashtable의 상태가.PSObject이러한 현상이 발생하는 이유를 설명하는 문서를 찾을 수 없었습니다.

당신이 경우는려하를 .Hashtable키를 속성 이름으로 사용하기 위해 다음 코드 행 중 하나를 사용할 수 있습니다.

[PSCustomObject]@{a=1;b=2;c=3}

# OR

New-Object PSObject -Property @{a=1;b=2;c=3}

# NOTE: Both have the type PSCustomObject

의 여개변는경우려하환를러를 ,Hashtables키가 속성 이름인 개체에 다음 코드를 사용할 수 있습니다.

@{name='a';num=1},@{name='b';num=2} |
 % { [PSCustomObject]$_ }

# OR

@{name='a';num=1},@{name='b';num=2} |
 % { New-Object PSObject -Property $_ }

<#
Outputs:

name num
---- ---
a      1
b      2
#>

에 관한 찾기NoteProperty어려웠습니다.문서에는 다음과 같은 내용이 없습니다.-MemberType다음 이외의 객체 속성을 추가하는 것이 타당합니다.NotePropertyWindows PowerShell Cookbook(3rd Edition)은 다음과 같이 정의되었습니다.Noteproperty멤버 유형:

제공하는 초기 값으로 정의된 속성

  • Lee, H. (2013).Windows PowerShell Cookbook.오라일리 미디어 주식회사 895쪽

PSObject의 장점 중 하나는 사용자 지정 메소드를 만들 수 있다는 것입니다.

예를들면,

$o = New-Object PSObject -Property @{
   "value"=9
}
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value {
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))"
} -inputObject $o

$o.Sqrt()

이를 통해 PSObject 속성의 정렬 순서를 제어할 수 있습니다(PSObject 정렬 참조).

저는 여러분이 보게 될 가장 큰 차이점은 성능이라고 생각합니다.다음 블로그 게시물을 보십시오.

개체 효율적인 결합 – 해시 테이블을 사용하여 개체 컬렉션 인덱싱

작성자는 다음 코드를 실행했습니다.

$numberofobjects = 1000

$objects = (0..$numberofobjects) |% {
    New-Object psobject -Property @{'Name'="object$_";'Path'="Path$_"}
}
$lookupobjects = (0..$numberofobjects) | % {
    New-Object psobject -Property @{'Path'="Path$_";'Share'="Share$_"}
}

$method1 = {
    foreach ($object in $objects) {
        $object | Add-Member NoteProperty -Name Share -Value ($lookupobjects | ?{$_.Path -eq $object.Path} | select -First 1 -ExpandProperty share)
    }
}
Measure-Command $method1 | select totalseconds

$objects = (0..$numberofobjects) | % {
    New-Object psobject -Property @{'Name'="object$_";'Path'="Path$_"}
}
$lookupobjects = (0..$numberofobjects) | % {
    New-Object psobject -Property @{'Path'="Path$_";'Share'="Share$_"}
}

$method2 = {
    $hash = @{}
    foreach ($obj in $lookupobjects) {
        $hash.($obj.Path) = $obj.share
    }
    foreach ($object in $objects) {
        $object |Add-Member NoteProperty -Name Share -Value ($hash.($object.path)).share
    }
}
Measure-Command $method2 | select totalseconds

블로그 작성자의 출력:

TotalSeconds
------------
 167.8825285
   0.7459279

코드 결과에 대한 그의 의견은 다음과 같습니다.

다 합치면 속도의 차이를 알 수 있습니다.내 컴퓨터에서 객체 메소드는 167초가 걸리는 반면 해시 테이블 메소드는 해시 테이블을 만든 다음 조회하는 데 1초 미만이 걸립니다.

다음은 보다 미묘한 기타 이점입니다.PowerShell 3.0에 사용자 지정 개체 기본값 표시

Windows-PKI에는 수많은 템플릿이 있으며 모든 활성 템플릿에서 작동하는 스크립트가 필요했습니다.템플릿을 동적으로 추가하거나 제거할 필요가 없습니다.제가 완벽하게 작동하는 것은 (읽는 것이 너무 "자연스러운" 것이기 때문에) 다음과 같습니다.

$templates = @(
    [PSCustomObject]@{Name = 'template1'; Oid = '1.1.1.1.1'}
    [PSCustomObject]@{Name = 'template2'; Oid = '2.2.2.2.2'}
    [PSCustomObject]@{Name = 'template3'; Oid = '3.3.3.3.3'}
    [PSCustomObject]@{Name = 'template4'; Oid = '4.4.4.4.4'}
    [PSCustomObject]@{Name = 'template5'; Oid = '5.5.5.5.5'}
)

foreach ($template in $templates)
{
   Write-Output $template.Name $template.Oid
}

유형-1: $PSCustomObject = [PSCustomObject] @{a=1;b=2;c=3;d=4;e=5;f=6}

유형 2: $PsObject = New-Object-TypeName PSObject - 속성 @{a=1;b=2;c=3;d=4;e=5;f=6}

Type-1과 Type-2의 유일한 차이점

  • Type-1 속성은 추가한 것과 같은 순서로 표시됩니다.
  • Type-1은 데이터를 더 빨리 열거합니다.
  • PSv2.0 이전 버전을 실행하는 시스템에서는 Type-1이 작동하지 않습니다.
  • Type-1과 Type-2 모두 유형입니다.“System.Management.Automation.PSCustomObject”

사이의 차이HashTable그리고.PSCustomObject/PSObject이라

  • PSCustomObject/PSObject에 새 메서드 및 속성을 추가할 수 있습니다.
  • 다음을 사용하여 파이프라인 매개 변수 바인딩에 PSCustomObject/PSObject를 사용할 수 있습니다.ValueFromPipelineByPropertyName좀보의 설명대로

예:[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

언급URL : https://stackoverflow.com/questions/14012773/difference-between-psobject-hashtable-and-pscustomobject

반응형