Begin to Process to End

blimeyoops·2023년 6월 30일

powershell

목록 보기
1/8

Begin, Process, End

Begin, Process, End는 함수의 플로우를 제어하는 방법이다.

  • 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은 옵션 블록으로 이 블록에서는 함수 전체에서 사용하는 변수, 배열등을 초기화해 함수를 설정한다.

BEGIN 
{ 
    Write-Host "In Begin block"
    $total = 0 # Initializing $total
}

Process

함수에서 실행되는 코드를 지정하기 위해 사용되고 함수는 다른 블록 없이 프로세스만 사용할 수 있다. 파이프라인 입력을 허용하도록 매개 변수를 설정한 경우 이 프로세스 블록은 필수이고 파라미터의 입력방법에 따라 다르게 동작한다.

  • 파이프라인 입력 - 각 입력 개체에 대해 프로세스를 한 번씩 호출하고 매개 변수에 바인딩한다.
  • 매개변수 입력 - 입력 전체가 매개변수 변수에 바인딩된다.
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가 호출된다.

End

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

0개의 댓글