여기에 좋은 답변이 있지만 다른 몇 가지를 지적하고 싶었습니다. 함수 매개 변수는 실제로 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
두 번째로 제공 되지만 매개 변수 이름을 명시 적으로 사용했기 때문에 작동합니다 . 두 번째 예는 위치에 따라 작동하므로 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 기능 중 하나이며 함수 내부의 코드를 매우 깨끗하게 만듭니다. 사용할 수있는 수많은 유효성 검사가 있습니다. 몇 가지 예는 다음과 같습니다.
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은 예외를 throw합니다.
또 다른 유용한 방법은 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"