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}
변하지않다니를 하지 않습니다.Hashtable
PSObject
또는 오류를 생성합니다.개체는 다음과 같이 유지됩니다.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
다음 이외의 객체 속성을 추가하는 것이 타당합니다.NoteProperty
Windows 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
언급URL : https://stackoverflow.com/questions/14012773/difference-between-psobject-hashtable-and-pscustomobject
'sourcetip' 카테고리의 다른 글
각 루프를 거치지 않고 사전 개체에서 모든 키(키만)를 가져오는 방법 (0) | 2023.08.21 |
---|---|
Pandas: Excel에서 병합된 헤더 열 구문 분석 (0) | 2023.08.21 |
스프링 데이터 jdbc 및 시퀀스 (0) | 2023.08.21 |
경고: 'variant.getJavaCompile()' API가 더 이상 사용되지 않으므로 'variant.getJavaCompileProvider()'로 대체되었습니다. (0) | 2023.08.21 |
mysqdump를 사용하여 CREATE TABLE 명령만 내보내려면 어떻게 해야 합니까? (0) | 2023.08.21 |