ⓟrogramming/PowerShell

POWERSHELL SCRIPT - 모듈화

뚱땡이 우주인 2018. 6. 28. 00:03

모듈화는 특정 작업을 위해 작성한 여러 가지 도구(개별 스크립트)의 내용을 간단히 하나의 파일에 모으고, 각 도구를 별도의 블록으로 구분하는 일


파워셸에서는 이렇게 블록으로 구분한 각 도구의 하나의 기능 집합으로 인식하며, 이를 함수(Funciton)이라고 부른다.


파워셸 함수 템플릿



Function Noun-Verb {
    [CmdletBindin()]
    param()
    BEGIN{}
    PROCESS{}
    END{}
}


param()

Param 내에는 대괄호 내에 매개변수의 처리 방식을 설정하는 부분과 매개변수의 형식과 이름을 선언. 함수에서 매개 변수가 필요 없는 경우는 비워둔다.

[Paramter(위치, 필수 매개변수, 파이프라인 입력)]

[데이터 형식]$변수명 = 기본값(옵션)


  • 함수에서 입력되는 매개변수 위치 : 지정하지 않아도 매개변수 위치를 자동으로 감지한다. 지정하면 조금 더 나은 가독성을 제공할 수 있다.

      Position = 정수 (예, 0, 1, 2 ....)

  • 필수 매개변수 여부

      Mandatory=$True or $False (False가 기본값)

  • 파이프라인 입력 허용 여부

      ValueFromPipeline=$True (기본값은 $False)



BEGIN

제일 먼저 실행되는 부분이며 한번만 실행된다.
주 로직이 실행되기 전에 사전 설정이 필요한 구문을 작성한다.
예를들어 데이터베이스 초기 연결 설정이 필요한 경우에 사용한다.
특별한 설정이 필요 없다면 비워 놓는다.

PROCESS

함수의 주 기능 로직이 들어가는 부분이다.
블록 내에 반복 처리하는 로직이 있는 경우, 초기 설정과 같은 구문을 BEGIN 블록에 넣지 않고 여기다 넣는다면 반복 실행하게 되어 의도치 않은 결과가 나올 수 있다.

END

제일 마지막에 실행되는 부분이다.

주로 정리 작업에 해당되는 구문이 여기에 들어간다.

예를들어 데이터 베이스 연결 종료와 같은 처리를 하는 곳이다.



function Get-SecurituEvents {
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true)]
        [string]$ComupterName,
        [int]$EventId = 4634
    )
    BEGIN
    {
        $LogName = Read-Host "로그 이름을 입력하세요."
    }
    PROCESS
    {
        Get-EventLog -ComputerName $ComupterName `
        -LogName $LogName |
        Where-Object -Property EventId -eq $EventId |
        Select-Object -First 7
    }
    END {}
}
BEGIN 블록에서 이벤트 뷰어에서 가져올 로그이름을 입력 받는 기본 설정 구문을 작성했다.

PROCESS 블록에서는 이벤트 ID를 필터링해서 최초 7개의 로그 항목을 가져오는 작업 구문을 입력했다.


위 함수를 실행해 보자

  1. PowerShell ISE나 콘솔에서 함수가 들어 있는 스크립트 파일을 실행한다. 이때 스크립트 내에서 작성한 모두 함수가 메모리에 올라간다.
  2. 실행하고 싶은 함수 이름을 콘솔에서 호출한다.
스크립트 내에 작성한 함수를 쓸 수 있는지 확인하려면 PSDrive중 Function: 드라이브를 확인하면 된다.



PS > cd Function:
PS Function:\> ls
위 명령을 실행해 보면 Get-SecurituEvents 를 현재 파워셸 세션에서 사용할 수 있음을 알 수 있다.