Jest tu kilka dobrych odpowiedzi, ale chciałem zwrócić uwagę na kilka innych rzeczy. Parametry funkcji są w rzeczywistości miejscem, w którym świeci PowerShell. Na przykład możesz mieć parametry nazwane lub pozycyjne w funkcjach zaawansowanych, takich jak:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
Następnie możesz albo wywołać go, podając nazwę parametru, albo możesz po prostu użyć parametrów pozycyjnych, ponieważ je wyraźnie zdefiniowałeś. Więc którykolwiek z nich działałby:
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Pierwszy przykład działa, mimo że Name
podany jest drugi, ponieważ jawnie użyliśmy nazwy parametru. Drugi przykład działa jednak w oparciu o pozycję, więc Name
musiałby być pierwszy. Jeśli to możliwe, zawsze staram się zdefiniować pozycje, aby obie opcje były dostępne.
PowerShell ma również możliwość definiowania zestawów parametrów. Wykorzystuje to zamiast przeciążania metod i znów jest całkiem przydatne:
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
)
}
Teraz funkcja przyjmie nazwę lub identyfikator, ale nie jedno i drugie. Możesz użyć ich pozycjonować lub według nazwy. Ponieważ są innego typu, PowerShell to rozwiąże. Wszystko to działałoby:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
Możesz także przypisać dodatkowe parametry do różnych zestawów parametrów. (To był oczywiście dość prosty przykład.) Wewnątrz funkcji można określić, który zestaw parametrów został użyty za pomocą właściwości $ PsCmdlet.ParameterSetName. Na przykład:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
Następnie, w powiązanej notatce dodatkowej, istnieje również sprawdzanie poprawności parametrów w PowerShell. Jest to jedna z moich ulubionych funkcji PowerShell i sprawia, że kod w twoich funkcjach jest bardzo czysty. Istnieje wiele walidacji, których możesz użyć. Oto kilka przykładów:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
W pierwszym przykładzie ValidatePattern akceptuje wyrażenie regularne, które zapewnia, że podany parametr odpowiada oczekiwaniom. Jeśli nie, zgłaszany jest intuicyjny wyjątek, który mówi dokładnie, co jest nie tak. W tym przykładzie „Coś” działałoby dobrze, ale „Lato” nie przejdzie weryfikacji.
ValidateRange zapewnia, że wartość parametru mieści się w zakresie oczekiwanym dla liczby całkowitej. Więc 10 lub 99 działałoby, ale 101 rzuciłoby wyjątek.
Kolejnym przydatnym jest ValidateSet, który pozwala jawnie zdefiniować tablicę dopuszczalnych wartości. W przypadku wprowadzenia czegoś innego zostanie zgłoszony wyjątek. Są też inne, ale prawdopodobnie najbardziej przydatnym jest ValidateScript. To wymaga bloku skryptu, który musi mieć wartość $ true, więc niebo jest granicą. Na przykład:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
W tym przykładzie mamy pewność, że nie tylko istnieje $ Path, ale jest to plik (w przeciwieństwie do katalogu) i ma rozszerzenie .csv. ($ _ odnosi się do parametru, gdy znajduje się w twoim bloku skryptu.) Możesz również przekazać znacznie większe, wieloliniowe bloki skryptu, jeśli ten poziom jest wymagany, lub użyć wielu bloków skryptu, jak ja tutaj. Jest niezwykle przydatny i zapewnia ładne czyste funkcje i intuicyjne wyjątki.
Test "ABC" "DEF"