Script, Function, Module 사용 및 .ps1/.psm1./.psd1/.ps1xml 구분하기


  • 복잡한 cmdlet을 늘 사용한다면 이것을 Powershell script 파일(확장자: .ps1)로 저장하여 사용하면 편리하다
    • 이 스크립트 파일을 실행하기 위해서는 Get-ExecutionPolicy RemoteSigned, Unrestricted 등으로 되어 있어야 한다.
    • 스크립트 파일 내용은 다음과 같다. (C:\localprofile.ps1)
      이것의 내용은 [로그온 한 사용자가 몇 몇이 있으며, 어떤 시간에 로그온 했는지 알 수 있는 ]이다.

      Param(
      [Parameter(Mandatory=$true)]
      $computer
      )
      GWmi -Class Win32_UserProfile -Computername $computer | ft localpath,@{Name=”lastUse”;Expression={[System.Management.ManagementDateTimeConverter]::ToDateTime($_.lastusetime)}} -Autosize

     c. 이 스크립트를 실행하면 다음과 같이 된다.

  • 그런데, 이 Script 파일안에 사용자가 직접 생성한 cmdlet(:Get-RemoteProfile)을 넣어서 사용하고자 할 때는 script Function을 사용하면 된다.
    • Function은 스크립트 내에 있는 여러 개의 사용자 정의 cmdlet을 재사용하고자 할 때 이용하는 것이다.
    • 어떤 종류의 Function이 있는지 확인하려면 dir Function:을 실행하면 된다.
    • Function에 포함된 cmdlet을 실행하려면 다음과 같이하면 된다. (Dot Sourcing 사용)
    • Function 내용은 다음과 같다. (C:\RemoteProfile.ps1)

      Function Get-RemoteProfile {
      Param(
      [Parameter(Mandatory=$true)]
      $computer
      )
      GWmi -Class Win32_UserProfile -Computername $computer | ft 

      localpath,@{Name=”lastUse”;Expression= 

      {[System.Management.ManagementDateTimeConverter]::ToDateTime

      ($_.lastusetime)}} -Autosize

      }

    • C:\RemoteProfile.ps1 파일이 저장되어 있으면. C:\RemoteProfile.ps1을 실행한다. 여기서 첫 번째 dot과 두 번째 경로 사이에는 반드시 스페이스로 한 칸 벌려야 한다.
    • 이렇게 한  script 내에 있는 cmdlet을 실행한다. , Get-RemoteProfile을 실행한다.


    • . C:\remoteprofile.ps1 을 실행하면 Function이 추가 되는데 Dir Function:을 해 보면 Get-RemoteProfile이라는 Function이 있음을 알 수 있다.


    • 그런데 Get-Command Get-RemoteProfile을 하면 보이지 않는다. , cmdlet로 등록된 것은 아니라는 것이다. 만약에 Get-RemoetProfile cmdlet로 등록하고자 하면 RemoteProfile.ps1 스 크립트 파일을 Module로 등록해야 한다.
  • 이제 .ps1 이라는 스크립트 파일을 .psm1 이라는 module 파일로 특정한 위치에 등록을 하면 계속 재사용하는 장점이 있다.
  • $pshome\modules 위치로 이동하여 RemoteProfile 이라는 폴더를 생성한다
  • c:\RemoteProfile.ps1 파일을 $PSHome\Modules\RemoteProfile\RemoteProfile.psm1 파일로 저장한다
  • 어떤 Module들이 있는지 확인하기 위해서 Get-Module -List를 하면 지금 생성한 RemoteProfile 모듈이 있다
  • Module을 등록하여 cmdlet을 사용해 본다.
    Import-Module -Name RemoteProfile
  • Get-RemoteProfile -Computer NYC-SVR1


  • Get-Command Get-RemoteProfile을 해보면 Function으로 명령어가 등록된 것을 알 수 있다.
  • 지금까지 PowerShell Script, Function, Module을 사용하였다. 이것들의 차이점을 구분해보자 
  • Script: 복잡한명령어를 하나의 파일을 만들어서 실행하면 쉽게 반복해서 그 작업을 할 수 있다. 파일 확장자는 .ps1이다
  • Function: Script 파일을 직접 실행하지 않고 Script내에 여러 개의 명령어를 직접 만들어서 명령어는 계속 재사용하고자 할 때 유용하다. 이 때 명령어를 사용하기 위해서는 Dot Sourcing 기법으으로  . ps1 파일을 실행한 후 해당 명령어를 실행해야 한다. 명령어는 여러 개를 만들어 사용할 수 있다. 파일 확장자는 Script와 동일하게 .ps1 파일이다
  • Module: Dot Sourcing을 하는 것이 불편하거나 자신이 만든 명령어를 다른 사람도 사용하도록 하기 위해서는 Module로 만들어서 사용하는 것이 좋다. 이 때 모듈을 항상 등록하여 사용해야 .(Import-Module) 특히, Module로 등록하여 사용하기 위해서는 $PSHome\Modules 폴더에 해당 폴더를 생성하여 .psm1 파일을 저장하여 사용해야 한다. 다른 컴퓨터 및 다른 세션에서 이 모듈에 포함된 명령어를 사용하기 위해서는 Profile에 넣어서 자동으로 모듈을 등록하게 하는 것이 편리하다

  • 스크립트와 관련된 파일 확장자를 구분하면 다음과 같다.

     

  • .ps1: Script Function 파일
  • .psm1: Script Module 파일
  • .psd1: Binary Module 파일
  • .ps1xml: Module 구성
    파일
Advertisements

Help 이해하기


  • Powershell에서는 Help(도움말, Get-Help)를 이해하는 것이 매우 중요하다.
  • 이 중에서 매개변수(Parameter)의 값 중에서 문자열이 있는데, 그 문자열의 <string[]>과 <string>의 차이점을 알아보자
    • <string> : 문자열 하나만 사용할 수 있다.
    • <string[]> : 문자열을 comma로 구분하여 여러 개를 사용할 수 있다.
  • Help Get-Childitem을 실행하면 -Filter에는 <string>이고, -Include에는 <string[]>으로 나온다.
    • Get-ChildItem [[-Path] <String[]>] [[-Filter] <String>] [-Exclude <String[]>] [-Force [<SwitchParameter>]] [-Include <String[]>]
  • 기본적으로 -Filter와 -Include는 원하는 항목만 찾아내는 기능으로서는 동일하지만, 도움말을 보면 조금 차이가 있다.
    • Get-ChildItem -Path $home -Recurse -Filter *.ps1
      Get-ChildItem -Path $home -Recurse -Include *.ps1
      ** 이 두 개의 결과는 동일하다. 하지만 성능은 -Filter가 더 좋다. 가능하면 -Filter를 사용하기를 권장한다.
      ** -Include는 꼭 -Recurse와 함께 사용해야 하지만 -Filter는 -Recurse를 함께 사용하지 않아도 된다
    • Get-ChildItem -Path $home -Recurse -Filter *.ps1, *.txt
      Get-ChildItem -Path $home -Recurse -Include *.ps1, *.txt
      ** -Filter는 실패하고 -Include는 성공한다. 그 이유는 도움말을 보면 -Filter는 <string>으로 나오기 때문에 값을 문자열 하나만 사용할 수 있다. 하지만 -Include는 <string[]>로 나오기 때문에 값을 comma로 사용하여 여러 개를 나열하여 사용할 수 있기 때문이다.
  • 결론은 Help를 볼 때  Parameter의 값이 문자열(String)일 때는 <string>인지, 아니면 <string[]>인지를 구문하여 여러 개의 값을 사용하는 여부를 확인한다 
  • 참고로 -ComputerName <string[]> 이므로 여러 개의 컴퓨터 이름을 comma로 구분하여 사용할 수 있다.