Maybaygiare.org

Blog Network

nytt objekt PSObject vs. PSCustomObject

det finns ofta viss förvirring när det gäller skillnaderna mellan att använda nytt objekt PSObject och PSCustomObject, liksom hur de två fungerar.

endera metoden kan användas för att ta en uppsättning värden från en samling PowerShell-objekt och sammanställa dem till en enda utgång. Båda vägarna kommer också att mata ut data som NoteProperties i systemet.Förvaltning.Automation.Pscustomobject objekttyper. Så vad är big deal mellan dem?

till att börja med introducerades cmdlet för nya objekt i PowerShell v1.0 och har gått igenom ett antal förändringar, medan användningen av pscustomobject klassen kom senare i v3.0. För system som använder PowerShell v2.0 eller tidigare måste New-Object användas. Huvudskillnaden mellan 2.0-versionen och 1.0-versionen ur administrativ synvinkel är att 2.0 tillåter användning av hashtabeller. Till exempel:

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

med metoden New-Object i PowerShell v1.0 måste du deklarera den objekttyp du vill skapa och lägga till medlemmar i samlingen i enskilda kommandon. Detta ändrades dock i v2.0 med möjligheten att använda hashtables:

nytt objekt i 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
}

här är utgången:

Obs theorderen av produktionen vs. ordning i hash tabellen

detta sparade en hel del overhead i att skriva och gav en renare ser skript. Båda metoderna har dock samma problem genom att utmatningen inte nödvändigtvis är i samma ordning som du har listat, så om du letar efter ett visst format kanske det inte fungerar. PSCustomObject fixade detta när det introducerades i v3.0, tillsammans med att ge mer effektivisering i dina skript.

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

notera ordningen på egenskaperna

som visat kommer din produktion alltid att matcha vad du har definierat i din Hashtable. En annan fördel med att använda PSCustomObject är att det har noterats att räkna upp data snabbare än dess motsvarighet till nya objekt. Det enda du behöver tänka på med PSCustomObject är att det inte fungerar med system som kör PSv2.0 eller tidigare.

Lämna ett svar

Din e-postadress kommer inte publiceras.