-
복잡한 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. 이 스크립트를 실행하면 다음과 같이 된다.
- 이 스크립트 파일을 실행하기 위해서는 Get-ExecutionPolicy가 RemoteSigned, Unrestricted 등으로 되어 있어야 한다.
-
그런데, 이 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 | ftlocalpath,@{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로 등록해야 한다.
- Function은 스크립트 내에 있는 여러 개의 사용자 정의 cmdlet을 재사용하고자 할 때 이용하는 것이다.
-
이제 .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 구성
파일
Month: December 2012
Help 이해하기
- Powershell에서는 Help(도움말, Get-Help)를 이해하는 것이 매우 중요하다.
-
이 중에서 매개변수(Parameter)의 값 중에서 문자열이 있는데, 그 문자열의 <string[]>과 <string>의 차이점을 알아보자
- <string> : 문자열 하나만 사용할 수 있다.
-
<string[]> : 문자열을 comma로 구분하여 여러 개를 사용할 수 있다.
- <string> : 문자열 하나만 사용할 수 있다.
-
Help Get-Childitem을 실행하면 -Filter에는 <string>이고, -Include에는 <string[]>으로 나온다.
- Get-ChildItem [[-Path] <String[]>] [[-Filter] <String>] [-Exclude <String[]>] [-Force [<SwitchParameter>]] [-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로 사용하여 여러 개를 나열하여 사용할 수 있기 때문이다.
- Get-ChildItem -Path $home -Recurse -Filter *.ps1
- 결론은 Help를 볼 때 각 Parameter의 값이 문자열(String)일 때는 <string>인지, 아니면 <string[]>인지를 구문하여 여러 개의 값을 사용하는 여부를 확인한다
- 참고로 -ComputerName은 <string[]> 이므로 여러 개의 컴퓨터 이름을 comma로 구분하여 사용할 수 있다.