Begin, Process, End는 함수의 플로우를 제어하는 방법이다.
스크립트를 실행하면 Begin부터 End까지 차례대로 실행된다.
Function Test-ScriptBlock
{
Param
(
[int]$Number
)
BEGIN
{
Write-Host "In Begin block"
}
PROCESS
{
Write-Host "In Process block"
}
END
{
Write-Host "In End block"
}
}
Test-ScriptBlock -Number 1
# output
# In Begin block
# In Process block
# In End block
Begin은 옵션 블록으로 이 블록에서는 함수 전체에서 사용하는 변수, 배열등을 초기화해 함수를 설정한다.
BEGIN
{
Write-Host "In Begin block"
$total = 0 # Initializing $total
}
함수에서 실행되는 코드를 지정하기 위해 사용되고 함수는 다른 블록 없이 프로세스만 사용할 수 있다. 파이프라인 입력을 허용하도록 매개 변수를 설정한 경우 이 프로세스 블록은 필수이고 파라미터의 입력방법에 따라 다르게 동작한다.
Function Test-ScriptBlock
{
Param
(
[int]$Number
)
BEGIN
{
Write-Host "In Begin block"
$total = 0 # Initializing $total
}
PROCESS
{
Write-Host "In Process block"
}
}
Test-ScriptBlock -Number 1, 2, 3
# 오류발생 : "System.Object[]" 유형의 "System.Object[]" 값을 "System.Int32" 유형으로 변환할 수 없습니다.
1, 2, 3 | Test-ScriptBlock
# In Begin block
# In Process block
# In Process block
# In Process block
위 스크립트에서 "Test-ScriptBlock -Number 1, 2, 3" 으로 매개변수를 전달하면 입력 전체가 매개변수에 바인딩 되므로 전달할 매개변수를 배열이고 함수에 받을 매개변수를 int 형식이므로 오류가 발생한다.
반면에 "1, 2, 3 | Test-ScriptBlock" 스크립트에서 파이프라인 형식으로 함수에 매개변수를 전달 각 입력 매개변수 만큼 Process가 호출된다.
Begin과 마찬가지로 End는 함수 호출마다 1회 호출된다.
Function Test-ScriptBlock
{
Param
(
[int]$Number
)
BEGIN
{
Write-Host "In Begin block"
$total = 0 # Initializing $total
}
PROCESS
{
Write-Host "In Process block"
}
END
{
Write-Host "In End block"
}
}
Test-ScriptBlock -Number 1, 2, 3
# 오류발생 : "System.Object[]" 유형의 "System.Object[]" 값을 "System.Int32" 유형으로 변환할 수 없습니다.
1, 2, 3 | Test-ScriptBlock
# In Begin block
# In Process block
# In Process block
# In Process block
# In End block