ここには良い答えがいくつかありますが、他にもいくつか指摘したいと思います。関数パラメーターは、実際にはPowerShellが優れている場所です。たとえば、次のような高度な関数では、名前付きパラメータまたは位置パラメータを使用できます。
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[int] $Id
)
}
次に、パラメーター名を指定してそれを呼び出すか、位置パラメーターを明示的に定義したため、それらを使用することができます。したがって、これらのいずれかが機能します。
Get-Something -Id 34 -Name "Blah"
Get-Something "Blah" 34
Name
パラメータ名を明示的に使用したため、最初の例は2番目に提供されている場合でも機能します。2番目の例は位置に基づいて機能Name
するため、最初にする必要があります。可能であれば、常に位置を定義して両方のオプションを使用できるようにします。
PowerShellには、パラメーターセットを定義する機能もあります。これは、メソッドのオーバーロードの代わりにこれを使用し、これも非常に便利です。
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
)
}
これで、関数は名前またはIDのいずれかを取得しますが、両方を取得することはありません。それらを位置的に、または名前で使用できます。それらは異なるタイプなので、PowerShellはそれを理解します。したがって、これらはすべて機能します:
Get-Something "some name"
Get-Something 23
Get-Something -Name "some name"
Get-Something -Id 23
さまざまなパラメーターセットに追加のパラメーターを割り当てることもできます。(これは明らかにかなり基本的な例でした。)関数内では、$ PsCmdlet.ParameterSetNameプロパティで使用されたパラメーターセットを確認できます。例えば:
if($PsCmdlet.ParameterSetName -eq "Name")
{
Write-Host "Doing something with name here"
}
次に、関連する補足として、PowerShellでのパラメーター検証もあります。これは私のお気に入りのPowerShell機能の1つであり、関数内のコードを非常にクリーンにします。使用できる検証は多数あります。例をいくつか示します。
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidatePattern('^Some.*')]
[string] $Name,
[Parameter(Mandatory=$true, Position=1)]
[ValidateRange(10,100)]
[int] $Id
)
}
最初の例では、ValidatePatternは、指定されたパラメーターが予期したものと一致することを保証する正規表現を受け入れます。そうでない場合は、直感的な例外がスローされ、何が問題かを正確に通知します。したがって、その例では、「Something」は正常に機能しますが、「Summer」は検証に合格しません。
ValidateRangeは、パラメーター値が整数に期待する範囲内であることを保証します。したがって、10または99は機能しますが、101は例外をスローします。
別の便利なものはValidateSetです。これにより、許容値の配列を明示的に定義できます。他に何かが入力されると、例外がスローされます。他にもありますが、おそらく最も役立つのはValidateScriptです。これは$ trueと評価する必要があるスクリプトブロックをとるため、空が限界です。例えば:
function Get-Something
{
Param
(
[Parameter(Mandatory=$true, Position=0)]
[ValidateScript({ Test-Path $_ -PathType 'Leaf' })]
[ValidateScript({ (Get-Item $_ | select -Expand Extension) -eq ".csv" })]
[string] $Path
)
}
この例では、$ Pathが存在するだけでなく、それが(ディレクトリではなく)ファイルであり、.csv拡張子が付いていることが保証されています。($ _は、スクリプトブロック内のパラメーターを指します。)そのレベルが必要な場合は、より大きな複数行のスクリプトブロックを渡すか、ここで行ったように複数のスクリプトブロックを使用することもできます。これは非常に便利で、すっきりとした機能と直感的な例外をもたらします。
Test "ABC" "DEF"