există adesea unele confuzii în ceea ce privește diferențele dintre utilizarea New-Object PSObject și PSCustomObject, precum și modul în care cele două de lucru.
oricare dintre abordări poate fi utilizată pentru a lua un set de valori dintr-o colecție de obiecte PowerShell și a le colaționa într-o singură ieșire. De asemenea, ambele căi vor afișa datele ca Noteproprietăți în sistem.Management.Automatizare.Tipuri de obiecte PSCustomObject. Deci, ce e mare scofală între ei?
pentru început, cmdletul cu obiecte noi a fost introdus în PowerShell v1.0 și a trecut printr-o serie de modificări, în timp ce utilizarea clasei PSCustomObject a venit mai târziu în v3.0. Pentru sistemele care utilizează PowerShell v2.0 sau o versiune anterioară, trebuie utilizat un obiect nou. Diferența cheie dintre versiunea 2.0 și versiunea 1.0 din punct de vedere administrativ este că 2.0 permite utilizarea tabelelor hash. De exemplu:
$Path = "c:\scripts"$Directory = Get-Acl -Path $PathForEach ($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}
cu metoda New-Object din PowerShell v1.0, trebuie să declarați tipul de obiect pe care doriți să îl creați și să adăugați membri în colecție în comenzi individuale. Acest lucru s-a schimbat însă în v2.0 cu capacitatea de a utiliza hashtables:
nou-obiect în PS 2.0
$Path = "c:\scripts"$Directory = Get-Acl -Path $PathForEach ($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}
Iată de ieșire:
Acest lucru a salvat o mulțime de aeriene în tastarea și a oferit un script curat în căutarea. Cu toate acestea, ambele metode au aceeași problemă prin faptul că ieșirea nu este neapărat în aceeași ordine în care o aveți listată, deci dacă căutați un anumit format, este posibil să nu funcționeze. PSCustomObject fix acest lucru atunci când a fost introdus în v3.0, împreună cu furnizarea de mai eficientizarea în script-uri.
PSCustomObject în PowerShell v3.0
$Path = "c:\scripts"$Directory = Get-Acl -Path $PathForEach ($Dir in $Directory.Access){@{Path = $PathOwner = $Directory.OwnerGroup = $Dir.IdentityReferenceAccessType = $Dir.AccessControlTypeRights = $Dir.FileSystemRights}#EndPSCustomObject}#EndForEach
după cum s-a demonstrat, rezultatul dvs. se va potrivi întotdeauna cu ceea ce ați definit în hashtable. Un alt avantaj al utilizării PSCustomObject este că a fost observat pentru a enumera datele mai repede decât omologul său nou-obiect. Singurul lucru de reținut cu PSCustomObject este că nu va funcționa cu sistemele care rulează PSv2.0 sau mai devreme.