336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

스크립트 모듈의 확장자 : .psm1


스크립트 모듈을 사용하면 특정 경로에서 스크립트 파일을 실행하고 함수를 다시 호출하는 과정을 거치지 않아도 된다. 기본 파워셸 명령을 사용할 때처럼 단순히 이름과 필요한 매개변수를 입력하여 사용하면 된다.


작성한 모듈을 올바른 위치에 정확한 파일 확장자로 저장했다면, 파워셸을 시작할 때마다 자동으로 모듈을 찾아 로드하기 때문에작성한 함수를 해당 셸 내에서 편리하게 사용할 수 있다.


스크립트 모듈을 저장하는 위치를 확인할 때 살펴볼 환경 변수가 PSModulePath 이다.



PS /> Get-Content Env:/PSModulePath                                                                                                        
/Users/{User-Name}/.local/share/powershell/Modules:/usr/local/share/powershell/Modules:/usr/local/microsoft/powershell/6.0.2/Modules

아래 경로에 모듈이 저장된다.
마이크로소프트에서 예약한 위치, 로그인한 사용자의 프로필 위치 시스템 전역 위치에 해당한다.
  • /Users/{User-Name}/.local/share/powershell/Modules
  • /usr/local/share/powershell/Modules
  • /usr/local/microsoft/powershell/6.0.2/Modules


스크립트 모듈을 만드는 방법

PSMail.psm1



function Send-OutlookMail{
    [CmdletBinding()]
    Param(
	    [Parameter(Mandatory=$False)]
        [string] $From = "김도균 ",
	    [Parameter(Mandatory=$True)]
        [string] $To,
        [Parameter(Mandatory=$False)]
        [string] $Cc = "steelflea@outlook.com",
        [Parameter(Mandatory=$True)]
        [string] $Subject,
        [Parameter(Mandatory=$False)]
        [string] $Body = "PowerShell에서 보낸 메일"
    )
    BEGIN 
    {
        $Cred = (Get-Credential)
        $SmtpSvr=“smtp.live.com”
        $SmtpPort="587"     
    }
    PROCESS
    {
        Send-MailMessage -From $From -To $To -Cc $Cc -Subject $Subject `
        -Body $Body -SmtpServer $SmtpSvr  -Port $SmtpPort -UseSsl `
        -Credential $Cred -Encoding UTF8
    }
    END
    {
        Clear-Variable -Name Cred
    }
}



위 모듈을 PSMail 이라는 폴더를 만들어 저정한다.

PS /usr/local/share/powershell/Modules/PSMail> ls -al                                                                                      
total 8
drwxr-xr-x  3 hongkun  admin  96  6 29 23:10 .
drwxr-xr-x  3 hongkun  admin  96  6 29 23:09 ..
-rw-r--r--@ 1 hongkun  admin  76  6 29 23:10 PSMail.psm1
PS /usr/local/share/powershell/Modules/PSMail> Send-                                                                                       
Send-MailMessage  Send-OutlookMail                                                                                                         
PS /usr/local/share/powershell/Modules/PSMail> Get-Module -ListAvailable                                                                   


    Directory: /usr/local/share/powershell/Modules


ModuleType Version    Name                                ExportedCommands                                                                
---------- -------    ----                                ----------------                                                                
Script     0.0        PSMail                              Send-OutlookMail                                                                


    Directory: /usr/local/microsoft/powershell/6.0.2/Modules


ModuleType Version    Name                                ExportedCommands                                                                
---------- -------    ----                                ----------------                                                                
Manifest   1.1.0.0    Microsoft.PowerShell.Archive        {Compress-Archive, Expand-Archive}                                              
Manifest   3.0.0.0    Microsoft.PowerShell.Host           {Start-Transcript, Stop-Transcript}                                             
Manifest   3.1.0.0    Microsoft.PowerShell.Management     {Add-Content, Clear-Content, Clear-ItemProperty, Join-Path...}                  
Manifest   3.0.0.0    Microsoft.PowerShell.Security       {Get-Credential, Get-ExecutionPolicy, Set-ExecutionPolicy, ConvertFrom-Secure...
Manifest   3.1.0.0    Microsoft.PowerShell.Utility        {Format-List, Format-Custom, Format-Table, Format-Wide...}                      
Script     1.1.7.0    PackageManagement                   {Find-Package, Get-Package, Get-PackageProvider, Get-PackageSource...}          
Script     1.6.0      PowerShellGet                       {Install-Module, Find-Module, Save-Module, Update-Module...}                    
Script     0.0        PSDesiredStateConfiguration         {ValidateNodeManager, Get-PublicKeyFromFile, Set-PSDefaultConfigurationDocume...
Script     1.2        PSReadLine                          {Get-PSReadlineKeyHandler, Set-PSReadlineKeyHandler, Remove-PSReadlineKeyHand...


Send- 까지만 입력하고 tab을 누르면 추가한 모듈을 확인 할 수 있다. 


블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

범위 

 설명

 범위 한정자

 전역

파워셸 세션을 시작할 때 범위

 $global:변수명

 로컬

 현재 범위, 전역 혹은 다른 범위가 될 수 있음

 $local:변수명

 스크립트

 스크립트 파일이 실행되는 동안 만들어지는 범위

스크립트 내에서 실행하는 명령 입장에서 로컬 범위는 스크립트 범위다.

 $script:변수명

 전용

(Private)

 외부에서 보이지 않는다.

 $private:변수명

 숫자를 부여한 범위

한 범위와 다른 범위의 상대 위치를 나타냄. 범위 0은 현재 또는 로컬을 나타내며, 범위 1은 직계 부모 범위, 범위2는 부모의 부모 범위와 같은 식으로 나타낸다. 

 



예제를 통해서 파워셸 범위를 확인해 보자.


CallFrom-Script.ps1
function global:CallFrom-Function {
    $callByFunction = "다른 함수에서 불렀어요."
    "callByFunction 변수는 $callByFunction"
}

function global:CallFrom-Script {
    $callByScript = "다른 스크립트에서 불렀어요."
    "callByScript 변수는 $callByScript"
}
FunctionScope.ps1
$Global:globalVar = "전역 범위. 스크립트 밖에서 접근"
function Check-FunctionScope {
    $functionVar = '함수 범위, 함수내에서만 접근'
    "functionVar은 $functionVar"
    $Local:lovalVarInFunc = '함수내에서 선언한 로컬 범위'
    $Script:scriptVarInFunc = '함수내에서 선언한 스크리브 범위'
    $Global:globalVarInFunc = '함수내에서 선언한 전역 범위'
    ''
    CallFrom-Function
}
''

$scriptVar = "스크립트 범위. 스크립트 내에서만 접근"
"scriptVar은 $scriptVar"

Check-FunctionScope
''
CallFrom-Script
실행
PS /Users/hongkun/workspace/powershell> /Users/hongkun/workspace/powershell/CallFrom-Script.ps1


PS /Users/hongkun/workspace/powershell> cd Function:
PS Function:/> ls
CallFrom-Script.ps1     Chap8Ex2.ps1            Check-FunctionScope     Check-FunctionScope.ps1 Get-SecurityEvents.ps1
PS Function:/> /Users/hongkun/workspace/powershell/Check-FunctionScope.ps1



scriptVar은 스크립트 범위. 스크립트 내에서만 접근
functionVar은 함수 범위, 함수내에서만 접근

callByFunction 변수는 다른 함수에서 불렀어요.

callByScript 변수는 다른 스크립트에서 불렀어요.
PS /Users/hongkun/workspace/powershell>

PS /Users/hongkun/workspace/powershell> $globalVar
전역 범위. 스크립트 밖에서 접근
PS /Users/hongkun/workspace/powershell> $scriptVar
스크립트 범위. 스크립트 내에서만 접근
블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

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


파워셸에서는 이렇게 블록으로 구분한 각 도구의 하나의 기능 집합으로 인식하며, 이를 함수(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 를 현재 파워셸 세션에서 사용할 수 있음을 알 수 있다.


'ⓟrogramming > PowerShell' 카테고리의 다른 글

POWERSHELL SCRIPT - 스크립트 모듈  (0) 2018.06.29
POWERSHELL SCRIPT - 파워셸 범위  (0) 2018.06.28
PowerShell Script - 변수  (0) 2018.06.26
PowerShell Script - 기초  (0) 2018.06.26
파이프라인 시스템  (0) 2018.06.25
블로그 이미지

뚱땡이 우주인

,