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 :
$Computer = [PSCustomObject]@{
ComputerName = $env:COMPUTERNAME
Description = 'Application Server'
}Une fois créé, cet objet expose ses propriétés via :
$Computer.PSObject.PropertiesEt 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 :
$Computer.PSObject.Properties.Add(
[psnoteproperty]::new(
'IPAddress',
'192.168.1.10'
)
)Résultat :
ComputerName Description IPAddress
------------ ----------- ---------
SRV-01 Application Server 192.168.1.10Cette 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é :
$Computer.PSObject.Properties.Remove('Description')Résultat :
ComputerName IPAddress
------------ ---------
SRV-01 192.168.1.10Pourquoi Add-Member est souvent inutile dans un foreach
Voici un exemple très courant :
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-Memberajoute une couche pipeline inutile
Dans ce scénario, l’écriture suivante est généralement plus cohérente :
$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 :
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.