Fondamentaux

PSObject vs PSCustomObject

Il existe souvent une certaine confusion entre les différences d’utilisation et de fonctionnement de New-Object PSObject et PSCustomObject.

L’une ou l’autre approche peuvent être utilisées pour extraire un ensemble de valeurs d’une collection d’objets PowerShell, et les assembler dans une seule sortie. De même, les deux méthodes génèrent des données sous la forme de NoteProperties dans des objets de type : System.Management.Automation.PSCustomObject.

Pour commencer, la cmdlet New-Object a été introduite dans PowerShell v1.0 et a subi de nombreux changements, tandis que l’utilisation de la classe PSCustomObject est apparue plus tard dans la v3.0. Pour les systèmes utilisant PowerShell version 2.0 ou antérieure, New-Object doit être utilisé. La principale différence entre la version 2.0 et la version 1.0 du point de vue administratif est que la version 2.0 autorise l’utilisation des Hashtable.

New-Object PSObject sur PS v1.0

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

Avec la méthode New-Object dans PowerShell v1.0, vous devez déclarer le type d’objet que vous voulez créer et ajouter des membres à la collection dans des commandes individuelles. Ceci a été modifié dans la v2.0, avec la possibilité d’utiliser des Hashtables.

New-Object PSObject sur PS v2.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
}

Cela a donc permis d’économiser beaucoup de temps lors de la frappe et de fournir un script plus propre. Cependant les deux méthodes ont le même problème : la sortie n’est pas nécessairement dans le même ordre que celui indiqué dans la liste. Par conséquent, si vous recherchez un format particulier, celui-ci risque de ne pas fonctionner. PSCustomObject a résolu ce problème lors de son introduction dans la v3.0, en plus de rationaliser davantage vos scripts.

PSCustomObject sur PS v3.0

$Path = 'c:\scripts'
$Directory = Get-Acl -Path $Path

ForEach ($Dir in $Directory.Access)
{
    [PSCustomObject]@{
        Path       = $Path
        Owner      = $Directory.Owner
        Group      = $Dir.IdentityReference
        AccessType = $Dir.AccessControlType
        Rights     = $Dir.FileSystemRights
    }
}

Comme démontré, votre sortie correspondra toujours à ce que vous avez défini dans votre Hashtable. Un autre avantage de l’utilisation de PSCustomObject est qu’il est plus rapide que son équivalent New-Object. La seule chose à garder à l’esprit avec PSCustomObject est qu’il ne fonctionnera pas avec les systèmes exécutant PowerShell v2.0 ou une version antérieure.

Test de performance

Outre le fait que nous avons différentes méthodes pour créer des objets, nous allons nous intéresser à leurs performances.

Pour évaluer la rapidité de création d’objets, j’exécute 1000 fois les différents scripts ci-dessus afin de générer le graphique suivant :

Comme le démontre ce graphique, la courbe grise indique clairement que la méthode PSCustomObject est bien plus rapide et plus simple d’utilisation que les autres méthodes de création d’objets.

Tags

Thomas ILLIET

Si le développement PowerShell était un art, vous pourriez certainement me considérer comme un artisan au sens noble du terme. Apportant un savoir-faire unique, un amour du travail bien fait et une personnalisation rendant chaque pièce produite parfaitement ciselée au besoin de son commanditaire.

Articles similaires

Fermer
Fermer