Créer des objets en PowerShell
Dernièrement j’ai travaillé avec PowerShell et j’avais besoin de passer beaucoup de paramètres entre des fonctions. Pour améliorer la lisibilité et la maintenabilité, j’ai donc regardé comment créer des objets en PowerShell. Je partage avec vous les 3 méthodes que j’ai rencontrées :
- Version simple : New-Object
- Version élaborée : New-Module –AsCustomObject
- Version classe : Class (PowerShell v5)
New-Object
Simple et efficace New-Object crée un objet qui n’attend que d’être construit par l’ajout de membres que ce soit des propriétés ou des méthodes.
function Get-Parameters(){
#new object
$parameters = New-Object -TypeName PSObject
#Add-Member
Add-Member -InputObject $parameters -MemberType NoteProperty -Name param1 -Value "value1"
Add-Member -InputObject $parameters -MemberType NoteProperty -Name param2 -Value "value2"
Add-Member -InputObject $parameters -MemberType NoteProperty -Name param3 -Value "value3"
#add method
$method = { Get-Date -f hh:mm:ss.fff }
Add-Member -InputObject $parameters -MemberType ScriptMethod -Name GetInvok -Value $method
return $parameters
}
function Start-ProcessWithParams($Parameters) {
$Parameters.param1
$Parameters.param2
$Parameters.param3
$Parameters.GetInvok()
}
$params = Get-Parameters
$params.GetInvok()
Start-ProcessWithParams -Parameters $params
Output
11:13:12.821
value1
value2
value3
11:13:12.837
On remarque bien que la méthode est exécutée à l’appel
# une notation courte
function Get-ParametersShort(){
$properties = @{
param1 = 'value1'
param2 = 'value2'
param3 = 'value3'
}
$parameters = new-object psobject -Property $properties
return $parameters
}
# une notation plus courte
function Get-ParametersShorter(){
$parameters = [PSCustomObject]@{
param1 = 'value1'
param2 = 'value2'
param3 = 'value3'
}
return $parameters
}
New-Module -AsCustomObject
Cette méthode est plus élaborée et permet d’obtenir un objet plus adapté car plus paramétrable. Il est possible de préciser le type de la propriété et les fonctions sont convenablement supportées.
function Get-Parameters2(){
$parameters = New-Module -AsCustomObject -ScriptBlock {
[string]$param1='value1'
[string]$param2='value2'
[string]$param3='value3'
Function GetInvok { Get-Date -f hh:mm:ss.fff}
Export-ModuleMember -Variable * -Function *
}
return $parameters
}
Si on met plusieurs objets dans un tableau, il est possible d’utiliser les si pratiques Sort, Select et Where.
Class avec PowerShell v5
PowerShell v5 introduit les classes ce qui rapproche encore plus PowerShell de C#.
Class Param {
[string]param1
[string]param2
[string]param3
}
$parameters = New-Object Param
$parameters.param1 = 'value1'
$parameters.param2 = 'value2'
$parameters.param3 = 'value3'
Plus d’informations sur les classes de PowerShell v5 sur le blog Hey, Scripting Guy! Blog