Il y a de bonnes réponses ici, mais je voulais souligner quelques autres choses. Les paramètres de fonction sont en fait un endroit où PowerShell brille. Par exemple, vous pouvez avoir des paramètres nommés ou positionnels dans des fonctions avancées comme ceci:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Ensuite, vous pouvez soit l'appeler en spécifiant le nom du paramètre, soit utiliser des paramètres positionnels, car vous les avez définis explicitement. Donc, l'un ou l'autre fonctionnerait:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Le premier exemple fonctionne même s'il Name
est fourni en second, car nous avons explicitement utilisé le nom du paramètre. Le deuxième exemple fonctionne cependant en fonction de la position, doncName
devrait donc être le premier. Lorsque cela est possible, j'essaie toujours de définir des positions afin que les deux options soient disponibles.
PowerShell a également la possibilité de définir des ensembles de paramètres. Il utilise cela à la place de la surcharge de méthode, et est encore très utile:
function Get-Something
{
[CmdletBinding(DefaultParameterSetName='Name')]
Param
(
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Name')]
[string] $Name,
[Parameter(Mandatory=$true, Position=0, ParameterSetName='Id')]
[int] $Id
)
}
Maintenant, la fonction prendra un nom ou un identifiant, mais pas les deux. Vous pouvez les utiliser de manière positionnelle ou par nom. Puisqu'ils sont d'un type différent, PowerShell le découvrira. Donc, tout cela fonctionnerait:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
Vous pouvez également affecter des paramètres supplémentaires aux différents jeux de paramètres. (C'était évidemment un exemple assez basique.) À l'intérieur de la fonction, vous pouvez déterminer quel ensemble de paramètres a été utilisé avec la propriété $ PsCmdlet.ParameterSetName. Par exemple:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Ensuite, sur une note connexe, il y a également la validation des paramètres dans PowerShell. C'est l'une de mes fonctionnalités PowerShell préférées, et cela rend le code à l'intérieur de vos fonctions très propre. Il existe de nombreuses validations que vous pouvez utiliser. Quelques exemples sont:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
Dans le premier exemple, ValidatePattern accepte une expression régulière qui garantit que le paramètre fourni correspond à ce que vous attendez. Si ce n'est pas le cas, une exception intuitive est levée, vous indiquant exactement ce qui ne va pas. Donc, dans cet exemple, «Quelque chose» fonctionnerait bien, mais «Summer» ne passerait pas la validation.
ValidateRange garantit que la valeur du paramètre se situe entre la plage attendue pour un entier. Donc 10 ou 99 fonctionneraient, mais 101 lèverait une exception.
Un autre utile est ValidateSet, qui vous permet de définir explicitement un tableau de valeurs acceptables. Si quelque chose d'autre est entré, une exception sera levée. Il y en a d'autres aussi, mais le plus utile est probablement ValidateScript. Cela prend un bloc de script qui doit être évalué à $ true, donc le ciel est la limite. Par exemple:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
Dans cet exemple, nous sommes assurés non seulement que $ Path existe, mais qu'il s'agit d'un fichier (par opposition à un répertoire) et possède une extension .csv. ($ _ fait référence au paramètre, à l'intérieur de votre bloc de script.) Vous pouvez également passer des blocs de script à plusieurs lignes beaucoup plus grands si ce niveau est requis, ou utiliser plusieurs blocs de script comme je l'ai fait ici. Il est extrêmement utile et offre de belles fonctions propres et des exceptions intuitives.
Test "ABC" "DEF"