Hier gibt es einige gute Antworten, aber ich wollte auf ein paar andere Dinge hinweisen. Funktionsparameter sind tatsächlich ein Ort, an dem PowerShell glänzt. Beispielsweise können Sie in erweiterten Funktionen wie folgt entweder benannte oder Positionsparameter haben:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Dann können Sie es entweder durch Angabe des Parameternamens aufrufen oder einfach Positionsparameter verwenden, da Sie diese explizit definiert haben. Beides würde also funktionieren:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Das erste Beispiel funktioniert, obwohl Name
es als zweites bereitgestellt wird, da wir den Parameternamen explizit verwendet haben. Das zweite Beispiel basiert jedoch auf der Position und muss daher Name
das erste sein. Wenn möglich, versuche ich immer, Positionen zu definieren, damit beide Optionen verfügbar sind.
PowerShell kann auch Parametersätze definieren. Es verwendet dies anstelle der Methodenüberladung und ist wiederum sehr nützlich:
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
)
}
Jetzt nimmt die Funktion entweder einen Namen oder eine ID an, aber nicht beide. Sie können sie positionell oder namentlich verwenden. Da es sich um einen anderen Typ handelt, wird PowerShell dies herausfinden. All dies würde also funktionieren:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
Sie können den verschiedenen Parametersätzen auch zusätzliche Parameter zuweisen. (Das war offensichtlich ein ziemlich einfaches Beispiel.) Innerhalb der Funktion können Sie bestimmen, welcher Parametersatz mit der Eigenschaft $ PsCmdlet.ParameterSetName verwendet wurde. Zum Beispiel:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
In einer verwandten Randnotiz gibt es dann auch eine Parameterüberprüfung in PowerShell. Dies ist eine meiner Lieblingsfunktionen von PowerShell und macht den Code in Ihren Funktionen sehr sauber. Es gibt zahlreiche Validierungen, die Sie verwenden können. Einige Beispiele sind:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
Im ersten Beispiel akzeptiert ValidatePattern einen regulären Ausdruck, der sicherstellt, dass der angegebene Parameter Ihren Erwartungen entspricht. Wenn dies nicht der Fall ist, wird eine intuitive Ausnahme ausgelöst, die Ihnen genau sagt, was falsch ist. In diesem Beispiel würde "Etwas" gut funktionieren, aber "Sommer" würde die Validierung nicht bestehen.
ValidateRange stellt sicher, dass der Parameterwert zwischen dem Bereich liegt, den Sie für eine Ganzzahl erwarten. Also würden 10 oder 99 funktionieren, aber 101 würde eine Ausnahme auslösen.
Ein weiteres nützliches ist ValidateSet, mit dem Sie ein Array akzeptabler Werte explizit definieren können. Wenn etwas anderes eingegeben wird, wird eine Ausnahme ausgelöst. Es gibt auch andere, aber das wahrscheinlich nützlichste ist ValidateScript. Dies erfordert einen Skriptblock, der mit $ true ausgewertet werden muss, sodass der Himmel die Grenze darstellt. Zum Beispiel:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
In diesem Beispiel wird nicht nur versichert, dass $ Path vorhanden ist, sondern dass es sich um eine Datei handelt (im Gegensatz zu einem Verzeichnis) und die Erweiterung .csv hat. ($ _ bezieht sich auf den Parameter in Ihrem Skriptblock.) Sie können auch viel größere mehrzeilige Skriptblöcke übergeben, wenn diese Ebene erforderlich ist, oder mehrere Skriptblöcke verwenden, wie ich es hier getan habe. Es ist äußerst nützlich und sorgt für schöne, saubere Funktionen und intuitive Ausnahmen.
Test "ABC" "DEF"