편집 참고 사항
중요하다
Windows PowerShell 언어 사양 3.0 2012년 12월에 게시되었으며 Windows PowerShell 3.0을 기반으로 합니다. 이 사양은 PowerShell의 현재 상태를 반영하지 않습니다. 현재 상태를 반영하도록 이 설명서를 업데이트할 계획은 없습니다. 이 설명서는 기록 참조를 위해 여기에 제공됩니다.
사양 문서는 Microsoft 다운로드 센터에서 Microsoft Word 문서로 사용할 수 있습니다. https://www.microsoft.com/download/details.aspx?id=36389 해당 Word 문서는 Microsoft Learn에서 프레젠테이션용으로 변환되었습니다. 변환하는 동안 Docs 플랫폼의 서식을 수용하기 위해 일부 편집 변경이 이루어졌습니다. 일부 오타 및 사소한 오류가 수정되었습니다.
11.1 소개
§3.14설명한 대로 모듈은 PowerShell 코드를 분할, 구성 및 추상화할 수 있는 자체 포함 재사용 가능한 단위입니다. 모듈에는 명령(예: cmdlet 및 함수) 및 항목(예: 변수 및 별칭)인하나 이상의
모듈 유형에는 세 가지가 있습니다: 매니페스트, 스크립트 및 바이너리.
매니페스트 모듈 모듈에 대한 정보를 포함하고 해당 모듈 사용의 특정 측면을 제어하는 파일입니다.
스크립트 모듈은 파일 확장명이 .psm1대신 .ps1인 PowerShell 스크립트 파일입니다.
이진 모듈에는 cmdlet 및 공급자를 정의하는 클래스 형식이 포함되어 있습니다. 스크립트 모듈과 달리 이진 모듈은 컴파일된 언어로 작성됩니다. 이진 모듈은 이 사양에서 다루지 않습니다.
이진 모듈은 PowerShell 라이브러리를 기반으로 컴파일된 .NET 어셈블리(즉, DLL)입니다.
모듈은 중첩될수 있습니다. 즉, 한 모듈이 다른 모듈을 가져올 수 있습니다. 연결된 중첩 모듈이 있는 것은 루트 모듈입니다.
PowerShell 세션이 만들어지면 기본적으로 모듈을 가져오지 않습니다.
모듈을 가져올 때 모듈을 찾는 데 사용되는 검색 경로는 PSModulePath
다음 cmdlet은 모듈을 처리합니다.
- Get-Module: 가져온 모듈 또는 가져올 수 있는 모듈을 식별합니다.
- Import-Module: 현재 세션에 하나 이상의 모듈을 추가합니다(§11.4참조).
- Export-ModuleMember: 내보낼 모듈 멤버를 식별합니다.
- 제거 모듈: 현재 세션에서 하나 이상의 모듈을 제거합니다(§11.5참조).
- New-Module: 동적 모듈을 만듭니다(§11.7참조).
11.2 스크립트 모듈 작성
스크립트 모듈은 스크립트 파일입니다. 다음 스크립트 모듈을 고려합니다.
function Convert-CentigradeToFahrenheit ([double]$tempC) {
return ($tempC * (9.0 / 5.0)) + 32.0
}
New-Alias c2f Convert-CentigradeToFahrenheit
function Convert-FahrenheitToCentigrade ([double]$tempF) {
return ($tempF - 32.0) * (5.0 / 9.0)
}
New-Alias f2c Convert-FahrenheitToCentigrade
Export-ModuleMember -Function Convert-CentigradeToFahrenheit
Export-ModuleMember -Function Convert-FahrenheitToCentigrade
Export-ModuleMember -Alias c2f, f2c
이 모듈에는 각각 별칭이 있는 두 개의 함수가 포함되어 있습니다. 기본적으로 모든 함수 이름과 함수 이름만 내보냅니다. 그러나 cmdlet Export-ModuleMember가 한 번이라도 어떤 항목을 내보내는 데 사용되면, 그 이후에는 명시적으로 내보낸 항목들만 내보내게 됩니다. 일련의 명령 및 항목을 한 번의 호출 또는 이 cmdlet에 대한 여러 호출로 내보낼 수 있습니다. 이러한 호출은 현재 세션에 대해 누적됩니다.
11.3 스크립트 모듈 설치
스크립트 모듈은 스크립트 파일에 정의되며 모듈은 모든 디렉터리에 저장할 수 있습니다. 환경 변수 PSModulePath는 모듈 관련 cmdlet이 이름에 정규화된 경로가 포함되지 않은 모듈을 찾을 때 검색할 디렉터리 집합을 가리킵니다. 추가 조회 경로를 제공할 수 있습니다. 예를 들어
$Env:PSModulePath = $Env:PSModulePath + ";<additional-path>"
추가된 추가 경로는 현재 세션에만 영향을 줍니다.
또는 모듈을 가져올 때 정규화된 경로를 지정할 수 있습니다.
11.4 스크립트 모듈 가져오기
모듈의 리소스를 사용하려면 먼저 cmdlet Import-Module사용하여 해당 모듈을 현재 세션으로 가져와야 합니다.
Import-Module 실제로 가져오는 리소스를 제한할 수 있습니다.
모듈을 가져오면 해당 스크립트 파일이 실행됩니다. 이 프로세스는 스크립트 파일에서 하나 이상의 매개 변수를 정의하고 Import-ModuleArgumentList 매개 변수를 통해 해당 인수를 전달하여 구성할 수 있습니다.
§11.2정의된 이러한 함수 및 별칭을 사용하는 다음 스크립트를 고려합니다.
Import-Module "E:\Scripts\Modules\PSTest_Temperature" -Verbose
"0 degrees C is " + (Convert-CentigradeToFahrenheit 0) + " degrees F"
"100 degrees C is " + (c2f 100) + " degrees F"
"32 degrees F is " + (Convert-FahrenheitToCentigrade 32) + " degrees C"
"212 degrees F is " + (f2c 212) + " degrees C"
모듈을 가져오면 모듈의 명령이나 항목 이름이 세션의 명령이나 항목과 같을 때 이름이 충돌합니다. 이름 충돌이 발생하면 이름이 숨겨지거나 바뀝히게 됩니다.
Import-Module 접두사 매개 변수를 사용하여 명명 충돌을 방지할 수 있습니다. 또한 별칭, Cmdlet, 함수및 변수 매개 변수는 가져올 명령 선택을 제한하여 이름 충돌 가능성을 줄일 수 있습니다.
명령이 숨겨져 있더라도, 그 명령이 출처한 모듈의 이름을 함께 사용하여 실행할 수 있습니다. 예를 들어 & M\F 100 모듈 M함수 F 호출하고 인수 100을 전달합니다.
세션에 이름이 같은 두 cmdlet과 같은 동일한 종류의 명령이 포함된 경우 기본적으로 가장 최근에 추가된 명령을 실행합니다.
모듈과 관련된 범위에 대한 논의는 §3.5.6 참조하세요.
11.5 스크립트 모듈 제거
cmdlet Remove-Module통해 세션에서 하나 이상의 모듈을 제거할 수 있습니다.
모듈을 제거해도 모듈은 삭제되지 않습니다.
스크립트 모듈에서는 다음과 같이 해당 모듈을 제거하기 전에 실행할 코드를 지정할 수 있습니다.
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = { *on-removal-code* }
11.6 모듈 매니페스트
§11.1명시한 대로 매니페스트 모듈은 모듈에 대한 정보를 포함하고 해당 모듈의 사용의 특정 측면을 제어하는 파일입니다.
모듈에는 해당 매니페스트가 필요하지 않지만 해당 매니페스트의 이름은 설명하는 모듈과 같지만 파일 확장명은 .psd1.
매니페스트에는 키 집합이 포함된 해시 테이블을 반환하는 PowerShell 스크립트의 제한된 하위 집합이 포함되어 있습니다. 이러한 키와 해당 값은 해당 모듈에
기본적으로 매니페스트는 데이터 파일입니다. 그러나 데이터 형식, if 문 및 산술 및 비교 연산자에 대한 참조를 포함할 수 있습니다. (할당, 함수 정의 및 루프는 허용되지 않습니다.) 매니페스트는 환경 변수에 대한 읽기 액세스 권한도 있으며 cmdlet Join-Path대한 호출을 포함할 수 있으므로 경로를 생성할 수 있습니다.
메모
편집기 참고: 원본 문서에는 모듈 매니페스트 파일에 허용되는 키 목록이 포함되어 있습니다. 해당 목록은 오래되고 불완전합니다. 모듈 매니페스트의 전체 키 목록은 New-ModuleManifest을 참조하세요.
필요한 유일한 키는 ModuleVersion.
다음은 간단한 매니페스트의 예입니다.
@{
ModuleVersion = '1.0'
Author = 'John Doe'
RequiredModules = @()
FunctionsToExport = 'Set*','Get*','Process*'
}
키 GUID은 string 값을 가지고 있습니다. 모듈에 대한 GUID(Globally Unique IDentifier)를 지정합니다.
GUID 사용하여 이름이 같은 모듈을 구분할 수 있습니다. 새 GUID를 만들려면 메서드 [guid]::NewGuid()호출합니다.
11.7 동적 모듈
동적 모듈은 cmdlet New-Module에 의해 런타임 시 메모리에서 생성되는 모듈로, 디스크에서 로드되지 않습니다. 다음 예제를 고려하세요.
$sb = {
function Convert-CentigradeToFahrenheit ([double]$tempC) {
return ($tempC * (9.0 / 5.0)) + 32.0
}
New-Alias c2f Convert-CentigradeToFahrenheit
function Convert-FahrenheitToCentigrade ([double]$tempF) {
return ($tempF - 32.0) * (5.0 / 9.0)
}
New-Alias f2c Convert-FahrenheitToCentigrade
Export-ModuleMember -Function Convert-CentigradeToFahrenheit
Export-ModuleMember -Function Convert-FahrenheitToCentigrade
Export-ModuleMember -Alias c2f, f2c
}
New-Module -Name MyDynMod -ScriptBlock $sb
Convert-CentigradeToFahrenheit 100
c2f 100
스크립트 블록 $sb 모듈의 내용을 정의합니다.이 경우 두 개의 함수와 두 개의 별칭을 해당 함수에 정의합니다. 디스크 내 모듈과 마찬가지로 함수만 기본적으로 내보내므로 함수와 별칭을 모두 내보내기 위해 Export-ModuleMember cmdlet 호출이 존재합니다.
New-Module 실행되면 Convert-CentigradeToFahrenheit 및 c2f에 대한 호출에 표시된 대로 내보낸 네 개의 이름을 세션에서 사용할 수 있습니다.
모든 모듈과 마찬가지로 동적 모듈의 멤버는 전역 범위의 자식인 프라이빗 모듈 범위에서 실행됩니다.
Get-Module 동적 모듈을 가져올 수 없지만 Get-Command 내보낸 멤버를 가져올 수 있습니다.
동적 모듈을 Get-Module에서 사용할 수 있도록 하려면, New-Module 명령을 Import-Module로 파이프하거나, New-Module이 반환하는 모듈 개체를 Import-Module로 파이프하십시오. 이 작업은 동적 모듈을 Get-Module 목록에 추가하지만 모듈을 디스크에 저장하거나 영구적으로 만들지는 않습니다.
11.8 폐쇄
동적 모듈을 사용하여 데이터가 부가된 함수인 클로저하나를 만들 수 있습니다. 다음 예제를 고려하세요.
function Get-NextID ([int]$StartValue = 1) {
$nextID = $StartValue
{
($Script:nextID++)
}.GetNewClosure()
}
$v1 = Get-NextID # get a scriptblock with $StartValue of 0
& $v1 # invoke Get-NextID getting back 1
& $v1 # invoke Get-NextID getting back 2
$v2 = Get-NextID 100 # get a scriptblock with $StartValue of 100
& $v2 # invoke Get-NextID getting back 100
& $v2 # invoke Get-NextID getting back 101
여기서 의도는 Get-NextID 시작 값을 지정할 수 있는 시퀀스에서 다음 ID를 반환하는 것입니다. 그러나 각각 고유한 $StartValue 및 $nextID 컨텍스트를 가진 여러 시퀀스를 지원해야 합니다. 이는 메서드 [scriptblock]::GetNewClosure(§4.3.7)에 대한 호출을 통해 수행됩니다.
GetNewClosure가 새 클로저를 만들 때마다 새 동적 모듈이 생성되고, 호출자 범위에 있는 변수(이 경우, 증가를 포함하는 스크립트 블록)가 이 새 모듈에 복사됩니다. 부모 함수 내에 정의된 nextId(스크립트 블록 외부)가 증가하도록 하려면 명시적 스크립트: 범위 접두사가 필요합니다.
물론 스크립트 블록은 명명된 함수일 필요는 없습니다. 예를 들어:
$v3 = & { # get a scriptblock with $StartValue of 200
param ([int]$StartValue = 1)
$nextID = $StartValue
{
($Script:nextID++)
}.GetNewClosure()
} 200
& $v3 # invoke script getting back 200
& $v3 # invoke script getting back 201
PowerShell