about_Using — 세션에서 사용할 네임스페이스 지정하기
about_Using — 세션에서 사용할 네임스페이스 지정하기
세션에서 사용할 네임스페이스(namespace)를 지정할 수 있게 해 주는 문법이에요. .NET 클래스나 멤버를 그냥 줄여서 쓸 수 있고, 스크립트 모듈이나 어셈블리에서 클래스를 가져와 쓸 수도 있죠.
본문
짧은 설명
세션에서 사용할 네임스페이스를 지정할 수 있게 해 줍니다.
긴 설명
using 문은 세션에서 사용할 네임스페이스를 지정할 수 있게 해 주는 구문이에요. 네임스페이스를 추가하면 .NET 클래스와 멤버를 더 간편하게 쓸 수 있고, 스크립트 모듈이나 어셈블리에서 클래스를 가져올 수도 있어요.
using 문은 스크립트나 모듈에서 다른 어떤 문장보다 먼저 와야 해요. 매개 변수(parameter) 포함해서, 주석 처리되지 않은 문장이 앞에 오면 안 됩니다.
using 문에는 변수를 넣으면 안 돼요.
여기서 한 가지 주의할 점은, using 문이 변수용 범위 한정자(modifier)인 Using:과는 다른 것이라는 거예요. 자세한 내용은 about_Remote_Variables 문서를 참고해 주세요.
네임스페이스 구문
.NET 네임스페이스에서 형식(type)을 가져올 때는 이렇게 써요:
using namespace <.NET-namespace>
네임스페이스를 지정해 두면 형식을 짧은 이름으로 참조하기가 훨씬 쉬워져요.
예제 — 형식 이름 확인을 위한 네임스페이스 추가
아래 스크립트는 "Hello World" 문자열의 암호화 해시(cryptographic hash)를 구해요.
using namespace System.Text와 using namespace System.IO가 어떻게 System.Text의 [UnicodeEncoding]과 System.IO의 [Stream], [MemoryStream] 참조를 간단하게 만들어 주는지 눈여겨보세요.
using namespace System.Text
using namespace System.IO
[string]$string = "Hello World"
## VALID VALUES ARE "SHA1", "SHA256", "SHA384", "SHA512", "MD5"
[string]$algorithm = "SHA256"
[byte[]]$stringBytes = [UnicodeEncoding]::Unicode.GetBytes($string)
[Stream]$memoryStream = [MemoryStream]::new($stringBytes)
$getFileHashSplat = @{
InputStream = $memoryStream
Algorithm = $algorithm
}
$hashFromStream = Get-FileHash @getFileHashSplat
$hashFromStream.Hash.ToString()
모듈 구문
PowerShell 모듈에서 클래스와 열거형(enumeration)을 가져올 때는 이렇게 써요:
using module <module-name>
<module-name>의 값은 모듈 이름, 완전한 모듈 지정(mod specification), 또는 모듈 파일 경로가 될 수 있어요.
<module-name>이 경로라면 그 경로는 절대 경로일 수도, 상대 경로일 수도 있어요. 상대 경로는 using 문이 들어 있는 스크립트를 기준으로 해석됩니다.
<module-name>이 이름이나 모듈 지정이라면 PowerShell은 PSModulePath에서 해당 모듈을 찾아요.
모듈 지정은 다음 키를 가진 해시 테이블(hashtable)이에요.
| 키 | 필수 여부 | 설명 |
|---|---|---|
ModuleName |
필수 | 모듈 이름을 지정해요. |
GUID |
선택 | 모듈의 GUID를 지정해요. |
그리고 아래 세 키 중 최소 하나는 반드시 지정해야 해요.
| 키 | 설명 |
|---|---|
ModuleVersion |
모듈의 허용 최소 버전을 지정해요. |
MaximumVersion |
모듈의 허용 최대 버전을 지정해요. |
RequiredVersion |
정확히 필요한 모듈 버전을 지정해요. 다른 버전 키와 함께 쓸 수 없어요. |
한 가지 차이가 있어요. Import-Module과 #Requires 문은 모듈이 정의한 함수, 별칭(alias), 변수만 가져와요. 그래서 클래스와 열거형은 가져오지 않습니다.
반면 using module 문은 스크립트 모듈이나 이진 모듈의 루트 모듈(ModuleToProcess)에서 클래스와 열거형을 가져와요. 중첩된 모듈이나 루트 모듈에 dot-source된 스크립트에 정의된 클래스·열거형은 일관되게 가져오지 못할 수 있어요. 그러니 모듈 밖의 사용자에게도 공개하고 싶은 클래스와 열거형은 루트 모듈에 직접 정의해 두는 게 좋습니다.
스크립트 모듈을 개발할 때 흔히 코드를 바꾼 뒤 Force 매개 변수를 써서 Import-Module로 새 버전을 다시 불러오곤 해요. 그런데 이 방식은 루트 모듈의 함수 변경에만 통하고, 중첩 모듈은 다시 불러지지 않아요. 게다가 갱신된 클래스·열거형을 불러올 방법도 없죠.
그래서 최신 버전으로 확실히 실행하려면 새 세션을 시작해야 해요. using 문으로 가져온 PowerShell 클래스와 열거형은 언로드할 수 없어요.
예제 — 스크립트 모듈에서 클래스 불러오기
이 예제에서는 CardGames라는 이름의 PowerShell 스크립트 모듈이 다음 클래스들을 정의하고 있어요.
DeckCard
앞서 말한 것처럼 Import-Module과 #Requires 문은 모듈 함수·별칭·변수만 가져오고, 클래스는 가져오지 않죠. using module 명령은 모듈을 가져오면서 클래스 정의까지 함께 불러옵니다.
using module CardGames
[Deck]$deck = [Deck]::new()
$deck.Shuffle()
[Card[]]$hand1 = $deck.Deal(5)
[Card[]]$hand2 = $deck.Deal(5)
[Card[]]$hand3 = $deck.Deal(5)
어셈블리 구문
다음 구문은 실행이 시작될 때 어셈블리에서 .NET 형식을 스크립트로 불러와요. 어셈블리 파일의 완전한(fully-qualified) 경로를 반드시 써야 해요.
using assembly <.NET-assembly-path>
using assembly 문은 Add-Type cmdlet과 비슷한데, 차이가 있어요. Add-Type cmdlet은 Add-Type이 실행되는 시점에 형식을 추가하지만, using assembly는 스크립트 실행이 시작될 때 형식을 불러와요. 자세한 내용은 Add-Type 문서를 참고해 주세요.
예제 — 어셈블리에서 형식 불러오기
이 예제는 어셈블리를 불러와서 데이터를 처리할 때 그 클래스를 쓸 수 있게 해 줘요. 아래 스크립트는 데이터를 YAML 형식으로 변환합니다.
using assembly './YamlDotNet.dll'
using namespace YamlDotNet
$yamlSerializer = [Serialization.Serializer]::new()
$info = [ordered]@{
Inventory = @(
@{ Name = 'Apples' ; Count = 1234 }
@{ Name = 'Bagels' ; Count = 5678 }
)
CheckedAt = [datetime]'2023-01-01T01:01:01'
}
$yamlSerializer.Serialize($info)
실행 결과는 이렇게 나와요:
Inventory:
- Name: Apples
Count: 1234
- Name: Bagels
Count: 5678
CheckedAt: 2023-01-01T01:01:01.0000000
더 알아보기
- about_Remote_Variables —
Using:범위 한정자와 원격 변수에 관한 내용 - Add-Type — 형식을 런타임에 추가하는 cmdlet