Maybaygiare.org

Blog Network

New-Object PSObject vs. PSCustomObject

Es gibt oft Verwirrung über die Unterschiede zwischen der Verwendung von New-Object PSObject und PSCustomObject sowie über die Funktionsweise der beiden.

Beide Ansätze können verwendet werden, um eine Reihe von Werten aus einer Sammlung von PowerShell-Objekten zu einer einzigen Ausgabe zusammenzufassen. Außerdem geben beide Wege die Daten als NoteProperties im System aus.Management.Automatisierung.PSCustomObject Objekttypen. Also, was ist die große Sache zwischen ihnen?

Zunächst wurde das Cmdlet New-Object in PowerShell v1 eingeführt.0 und hat eine Reihe von Änderungen durchlaufen, während die Verwendung der PSCustomObject Klasse später in v3.0 kam. Für Systeme, die PowerShell v2.0 oder früher verwenden, muss New-Object verwendet werden. Der Hauptunterschied zwischen der 2.0-Version und der 1.0-Version aus administrativer Sicht besteht darin, dass 2.0 die Verwendung von Hash-Tabellen ermöglicht. Beispiel:

$Path = "c:\scripts"
$Directory = Get-Acl -Path $Path
ForEach ($Dir in $Directory.Access){
$DirPermissions = New-Object -TypeName PSObject
$DirPermissions | Add-Member -MemberType NoteProperty -Name Path -Value $Path
$DirPermissions | Add-Member -MemberType NoteProperty -Name Owner -Value $Directory.Owner
$DirPermissions | Add-Member -MemberType NoteProperty -Name Group -Value $Dir.IdentityReference
$DirPermissions | Add-Member -MemberType NoteProperty -Name AccessType -Value $Dir.AccessControlType
$DirPermissions | Add-Member -MemberType NoteProperty -Name Rights -Value $Dir.FileSystemRights
$DirPermissions
}

Mit der Methode New-Object in PowerShell v1.0 müssen Sie den Objekttyp, den Sie erstellen möchten, deklarieren und der Sammlung in einzelnen Befehlen Mitglieder hinzufügen. Dies änderte sich jedoch in v2.0 mit der Möglichkeit, Hashtables zu verwenden:

Neues Objekt in PS 2.0

$Path = "c:\scripts"
$Directory = Get-Acl -Path $Path
ForEach ($Dir in $Directory.Access){
$DirPermissions = New-Object -TypeName PSObject -Property @{
'Path' = $Path
'Owner' = $Directory.Owner
'Group' = $Dir.IdentityReference
'AccessType' = $Dir.AccessControlType
'Rights' = $Dir.FileSystemRights
}
$DirPermissions
}

Hier ist die Ausgabe:

Beachten Sie die Reihenfolge der Ausgabe im Vergleich zur Reihenfolge in der Hash-Tabelle

Dies ersparte viel Aufwand beim Tippen und lieferte ein sauberer aussehendes Skript. Beide Methoden haben jedoch das gleiche Problem, da die Ausgabe nicht unbedingt in derselben Reihenfolge erfolgt, in der sie aufgelistet sind. PSCustomObject hat dies behoben, als es in v3.0 eingeführt wurde, und bietet mehr Rationalisierung in Ihren Skripten.

PSCustomObject in PowerShell v3.0

$Path = "c:\scripts"
$Directory = Get-Acl -Path $Path
ForEach ($Dir in $Directory.Access){
@{
Path = $Path
Owner = $Directory.Owner
Group = $Dir.IdentityReference
AccessType = $Dir.AccessControlType
Rights = $Dir.FileSystemRights
}#EndPSCustomObject
}#EndForEach

Beachten Sie die Reihenfolge der Eigenschaften

Wie gezeigt, stimmt Ihre Ausgabe immer mit dem überein, was Sie in Ihrer Hashtabelle definiert haben. Ein weiterer Vorteil der Verwendung von PSCustomObject besteht darin, dass festgestellt wurde, dass die Daten schneller aufgezählt werden als das Gegenstück zu neuen Objekten. Das einzige, was Sie bei PSCustomObject beachten sollten, ist, dass es nicht mit Systemen funktioniert, auf denen PSv2.0 oder früher ausgeführt wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.