Powershell에서 함수의 parameter를 설정하려면 param 키워드 블록을 사용한다.
Function Get-HelloWorld {
Param($word)
$word
}
Get-HelloWorld -word 'Hello World'
## output
## Hello World
위 코드는 parameter $word에 넘겨진 값을 그대로 출력해준다. 즉, 매개변수에 전달된 값이 없을 경우는 빈 문자열을 출력한다.
매개변수의 값을 필수로 전달하기 위해서는 필수 매개변수라는 속성을 지정해 주어야 한다.
Parameter 특성은 다양한 방식으로 매개변수의 동작을 변경한다.
Param
(
[Parameter(
Mandatory=<Boolean>,
Position=<Integer>,
ParameterSetName=<String>,
ValueFromPipeline=<Boolean>,
ValueFromPipelineByPropertyName=<Boolean>,
ValueFromRemainingArguments=<Boolean>,
HelpMessage=<String>,
)]
[string]
$Parameter1
)
Mandatory 속성은 매개변수의 사용을 강제하는 기능이다. 매개변수 없이 함수를 실행하면 값이 입력될 때까지 실행이 중단된다.
Function Get-HelloWorld {
Param(
[Parameter(Mandatory=$true)]
$word
)
$word
}
Get-HelloWorld
## Output
## cmdlet Get-HelloWorld(명령 파이프라인 위치 1)
## 다음 매개 변수에 대한 값을 제공하십시오.
## word:
Posision 속성은 매개변수의 위치를 제어하는 기능이다.
Function Get-HelloWorld {
Param(
[Parameter(Mandatory=$true, Position=2)]
[string]$word,
[Parameter(Mandatory=$true, Position=1)]
[string]$word2
)
$word
$word2
}
Get-HelloWorld 'Hello' 'World'
## Output
## World
## Hello
ParameterSetName은 함수 호출시 서로 다른 매개변수를 지정하는 것이다. 즉, 매개변수가 서로 상호 배타적이어서 두 매개변수를 동시에 사용할 수 없음을 의미한다.
Function Get-HelloWorld {
Param(
[Parameter(Mandatory=$true, ParameterSetName='ByFirst')]
[string]$word,
[Parameter(Mandatory=$true, ParameterSetName='BySecond')]
[string]$word2
)
$word
$word2
}
Get-HelloWorld
## Output
## Error
## Get-HelloWorld : 지정한 명명된 매개 변수를 사용하여 매개 변수 집합을 확인할 수 없습니다.
Get-HelloWorld -word 'Hello' -word2 'World'
## Output
## Error
## Get-HelloWorld : 지정한 명명된 매개 변수를 사용하여 매개 변수 집합을 확인할 수 없습니다.
위 스크립트에서 두 매개변수 word, word2는 서로 상호배타적이며 매개변수를 지정하지 않고 호출하거나 두 매개변수를 모두 지정하고 호출하면 오류가 발생한다.
만약 매개변수를 지정하지 않고 호출하기 위해서는 CmdletBinding 특성의 DefaultParameterSetName 속성을 이용해 하나의 매개변수 집합을 필수로 지정한다.
Function Get-HelloWorld {
[CmdletBinding(DefaultParameterSetName='ByFirst')]
Param(
[Parameter(Mandatory=$true, ParameterSetName='ByFirst')]
[string]$word,
[Parameter(Mandatory=$true, ParameterSetName='BySecond')]
[string]$word2
)
$word
$word2
}
Get-HelloWorld
## Output
## cmdlet Get-HelloWorld(명령 파이프라인 위치 1)
## 다음 매개 변수에 대한 값을 제공하십시오.
## word:
매개변수 없이 호출했을때 오류를 반환하는것이 아니라 DefaultParameterSetName으로 지정한 ParameterSetName의 매개변수를 입력하라고 출력된다.
위 함수명처럼 HelloWorld를 입력받아 출력하는 함수에 Hello world 이외의 문자열을 매개변수로 전달하면 해당 문자열이 출력된다. 만약 첫번째 매개변수는 Hello, 두번째 매개변수는 World 이외의 문자를 허용하지 않기 위해서는 어떻게 해야 할까?
ValidateSet속성을 사용하면 매개변수 값으로 허용되는 값 목록을 지정할 수 있다.
Function Get-HelloWorld {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[ValidateSet("Hello")]
[string]$word,
[Parameter(Mandatory=$true)]
[ValidateSet("World")]
[string]$word2
)
$word
$word2
}
Get-HelloWorld -word "Hello" -word2 "World"
## Output
## Hello
## World
Get-HelloWorld -word "World" -word2 "Hello"
## Output
## Get-HelloWorld : 'word' 매개 변수에 대한 인수의 유효성을 검사할 수 없습니다. "World" 인수가 ValidateSet 특성에 지정된 "Hello" 집합에 속하지 않습니다. 집합에 속한 인수를 제공하고 명령을 다시 시도하십시오.
## 위치 줄:1 문자:22
## + Get-HelloWorld -word "World" -word2 "Hello"
## + ~~~~~~~
## + CategoryInfo : InvalidData: (:) [Get-HelloWorld], ParameterBindingValidationException
## + FullyQualifiedErrorId : ParameterArgumentValidationError,Get-HelloWorld
위 함수들의 매개변수 전달은 일반적으로 -ParameterName "Value"를 통해서 전달된다. 또한 Powershell에서 매개변수 전달은 파이프라인을 통해서도 전달될 수 있다.
Parameter특성의 ValueFromPipeline, ValueFromPipelineByPropertyName 속성은 매개변수가 파이프라인으로 전달된다.
word,word2
Hello,World
Function Get-HelloWorld {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName)]
[ValidateSet("Hello")]
[string]$word,
[Parameter(Mandatory=$true, ValueFromPipelineByPropertyName)]
[ValidateSet("World")]
[string]$word2
)
$word
$word2
}
Import-Csv -Path 'D:\variable.csv' | Get-HelloWorld
## Output
## Hello
## World