A menudo hay cierta confusión con respecto a las diferencias entre el uso de PSObject de objeto nuevo y PSCustomObject, así como la forma en que funcionan los dos.
Cualquiera de los enfoques se puede usar para tomar un conjunto de valores de una colección de objetos de PowerShell y agruparlos en una única salida. Además, ambas vías generarán los datos como propiedades de nota en el Sistema.Gestión.Automatización.Tipos de objetos PSCustomObject. Entonces, ¿cuál es el problema entre ellos?
Para empezar, el cmdlet New-Object se introdujo en PowerShell v1.0 y ha pasado por una serie de cambios, mientras que el uso de la clase PSCustomObject llegó más tarde en la versión 3.0. Para los sistemas que usan PowerShell v2.0 o anterior, se debe usar New-Object. La diferencia clave entre la versión 2.0 y la versión 1.0 desde un punto de vista administrativo es que la versión 2.0 permite el uso de tablas hash. Por ejemplo:
$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}
Con el método New-Object de PowerShell v1.0, debe declarar el tipo de objeto que desea crear y agregar miembros a la colección en comandos individuales. Sin embargo, esto cambió en v2.0 con la capacidad para el uso de tablas hash:
Nuevo-Objeto en 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}
he Aquí el resultado:
Esto salvó un montón de sobrecarga en la tipificación y proporciona un limpiador en busca de secuencia de comandos. Sin embargo, ambos métodos tienen el mismo problema en que la salida no está necesariamente en el mismo orden que la lista, por lo que si está buscando un formato en particular, puede que no funcione. PSCustomObject solucionó esto cuando se introdujo en la versión 3.0, además de proporcionar una mayor racionalización en sus scripts.
PSCustomObject en 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
Como se ha demostrado, el resultado será siempre coinciden con lo que se ha definido en la tabla hash. Otra ventaja de usar PSCustomObject es que se ha observado que enumera los datos más rápido que su contraparte de objetos Nuevos. Lo único a tener en cuenta con PSCustomObject es que no funcionará con sistemas que ejecuten PSv2.0 o versiones anteriores.