Il y a souvent une certaine confusion en ce qui concerne les différences entre l’utilisation de PSObject Nouvel Objet et PSCustomObject, ainsi que le fonctionnement des deux.
L’une ou l’autre approche peut être utilisée pour prendre un ensemble de valeurs d’une collection d’objets PowerShell et les rassembler en une seule sortie. De plus, les deux avenues produiront les données sous forme de propriétés dans le système.Gestion.Automatisation.Types d’objets PSCustomObject. Alors, quel est le problème entre eux?
Pour commencer, l’applet de commande New-Object a été introduite dans PowerShell v1.0 et a subi un certain nombre de changements, tandis que l’utilisation de la classe PSCustomObject est venue plus tard dans la version 3.0. Pour les systèmes utilisant PowerShell v2.0 ou une version antérieure, New-Object doit être utilisé. La principale différence entre la version 2.0 et la version 1.0 d’un point de vue administratif est que la version 2.0 permet l’utilisation de tables de hachage. Par exemple :
$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}
Avec la méthode New-Object dans PowerShell v1.0, vous devez déclarer le type d’objet que vous souhaitez créer et ajouter des membres à la collection dans des commandes individuelles. Cela a cependant changé dans la v2.0 avec la possibilité d’utiliser des tables de hachage:
Nouvel objet dans 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}
Voici la sortie:
Cela a permis d’économiser beaucoup de temps de frappe et a fourni un script plus propre. Cependant, les deux méthodes ont le même problème en ce sens que la sortie n’est pas nécessairement dans le même ordre que vous l’avez répertoriée, donc si vous recherchez un format particulier, cela peut ne pas fonctionner. PSCustomObject a corrigé cela lorsqu’il a été introduit dans la version 3.0, tout en offrant plus de rationalisation dans vos scripts.
PSCustomObject dans 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
figcaption>
Comme démontré, votre sortie correspondra toujours à ce que vous avez défini dans votre table de hachage. Un autre avantage de l’utilisation de PSCustomObject est qu’il a été noté d’énumérer les données plus rapidement que son homologue New-Object. La seule chose à garder à l’esprit avec PSCustomObject est qu’il ne fonctionnera pas avec les systèmes exécutant PSv2.0 ou une version antérieure.