Maybaygiare.org

Blog Network

New-Object PSObject vs.PSCustomObject

często występują pewne nieporozumienia dotyczące różnic pomiędzy używaniem nowego obiektu PSObject a PSCustomObject, a także sposobu działania tych dwóch obiektów.

oba podejścia mogą być użyte do pobrania zestawu wartości z kolekcji obiektów PowerShell i zestawiania ich w jedno wyjście. Ponadto obie metody będą generować dane w postaci notatek w systemie.Zarządzanie.Automatyzacja.Typy obiektów PSCustomObject. Więc o co im chodzi?

na początek, nowy-Object cmdlet został wprowadzony w PowerShell v1.0 i przeszedł szereg zmian, podczas gdy użycie klasy PSCustomObject pojawiło się później w wersji 3.0. Dla Systemów używających PowerShell v2. 0 lub wcześniejszych, należy użyć New-Object. Kluczową różnicą między wersją 2.0 A wersją 1.0 z administracyjnego punktu widzenia jest to, że 2.0 umożliwia korzystanie z tabel hashowych. Na przykład:

$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
}

przy pomocy metody New-Object w PowerShell v1.0 należy w poszczególnych poleceniach zadeklarować typ obiektu, który chcemy utworzyć i dodać do kolekcji elementy. Zmieniło się to jednak w wersji v2.0 z możliwością używania hashtabli:

New-Object w 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
}

oto wyjście:

Uwaga teoretyk wyjścia a kolejność w tabeli skrótu

to zapisało wiele narzutu podczas pisania i zapewniło czystszy wygląd skryptu. Jednak obie metody mają ten sam problem, ponieważ dane wyjściowe niekoniecznie są w tej samej kolejności, w jakiej zostały wymienione, więc jeśli szukasz konkretnego formatu, może to nie działać. Pscustomobject naprawił to, gdy zostało wprowadzone w wersji 3.0, wraz z zapewnieniem większej usprawnienia w skryptach.

PSCustomObject w 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

zwróć uwagę na kolejność właściwości

jak pokazano, Twoje dane wyjściowe zawsze będą zgodne z tym, co zdefiniowałeś w tabeli hash. Kolejną zaletą korzystania z PSCustomObject jest to, że zauważono, że wylicza dane szybciej niż jego odpowiednik nowego obiektu. Jedyną rzeczą, o której należy pamiętać w PSCustomObject, jest to, że nie będzie działać z systemami z systemem PSv2.0 lub wcześniejszym.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.