Add-Member PowerShell : doit-on toujours l’utiliser ?

Add-Member est une cmdlet PowerShell très utilisée pour ajouter des propriétés à un objet ou à un PSCustomObject.

Mais dans de nombreux scripts PowerShell, notamment à l’intérieur d’une boucle foreach, Add-Member ajoute une couche pipeline inutile alors que l’objet courant est déjà directement accessible.

Dans ces cas-là, PSObject.Properties.Add() est souvent plus simple, plus direct et plus cohérent avec le fonctionnement réel du moteur objet PowerShell.

Créer un PSCustomObject en PowerShell

Prenons un objet PowerShell classique :

PowerShell
$Computer = [PSCustomObject]@{
    ComputerName = $env:COMPUTERNAME
    Description  = 'Application Server'
}

Une fois créé, cet objet expose ses propriétés via :

PowerShell
$Computer.PSObject.Properties

Et cette collection possède déjà ses propres méthodes .Add() et .Remove().

Ajouter une propriété sans Add-Member en PowerShell

Au lieu d’utiliser Add-Member, il est possible d’ajouter directement une propriété à l’objet :

PowerShell
$Computer.PSObject.Properties.Add(
    [psnoteproperty]::new(
        'IPAddress',
        '192.168.1.10'
    )
)

Résultat :

PowerShell
ComputerName Description        IPAddress
------------ -----------        ---------
SRV-01       Application Server 192.168.1.10

Cette approche évite une cmdlet supplémentaire lorsque l’objet courant est déjà disponible.

Supprimer une propriété d’un PSCustomObject

Le même principe fonctionne pour supprimer une propriété :

PowerShell
$Computer.PSObject.Properties.Remove('Description')

Résultat :

PowerShell
ComputerName IPAddress
------------ ---------
SRV-01       192.168.1.10

Pourquoi Add-Member est souvent inutile dans un foreach

Voici un exemple très courant :

PowerShell
foreach ($Server in $Servers) {

    $Object = [PSCustomObject]@{
        Name = $Server
    }

    $Object | Add-Member `
        -NotePropertyName Status `
        -NotePropertyValue 'Online'

    $Object
}

Le problème ici est simple :

  • la boucle existe déjà
  • l’objet courant existe déjà
  • Add-Member ajoute une couche pipeline inutile

Dans ce scénario, l’écriture suivante est généralement plus cohérente :

PowerShell
$Object.PSObject.Properties.Add(
    [psnoteproperty]::new(
        'Status',
        'Online'
    )
)

L’ajout est direct, lisible et évite le surcoût d’une cmdlet pensée principalement pour le pipeline.

Quand utiliser Add-Member en PowerShell

Add-Member reste très utile lorsqu’on travaille directement dans une chaîne pipeline :

PowerShell
Get-Service |
    Add-Member -PassThru `
        -NotePropertyName CollectedAt `
        -NotePropertyValue (Get-Date)

Dans ce cas, la cmdlet joue pleinement son rôle en enrichissant un flux d’objets PowerShell de manière déclarative.

Conclusion

Add-Member reste une excellente cmdlet PowerShell.

Mais lorsqu’un objet est déjà directement manipulé dans une boucle foreach, PSObject.Properties.Add() est souvent plus logique.

PowerShell expose énormément de son moteur objet nativement.

Et parfois, le chemin le plus court est déjà disponible juste sous la surface.


Laisser un commentaire