개요
Import-Module, Get-Module, Remove-Module은 74장에서 만든(또는 이미 설치된) 모듈을 세션에 불러오고, 무엇이 로드돼 있는지 확인하고, 다시 내보내는 세 가지 기본 동작을 담당한다. PowerShell 3.0부터는 대부분의 경우 이 cmdlet을 직접 부르지 않아도 자동 로딩(autoloading)으로 알아서 처리되지만, 그 기본 동작을 이해해야 자동 로딩이 안 되는 예외 상황에 대처할 수 있다.
정신 모델은 “설치된 모듈은 아직 세션에 들어오지 않은 상자와 같고, 그 안의 명령을 처음 부르는 순간 PowerShell이 알아서 상자를 열어 세션에 풀어놓는다"는 것이다 — Import-Module은 이 과정을 수동으로 강제하는 것이다.
사용법
| |
종류
| 상황 | 필요한 동작 |
|---|---|
$Env:PSModulePath에 있는 모듈의 명령을 처음 호출 | 자동 로딩 — 아무것도 안 해도 됨 |
| 표준 경로 밖의 모듈 | Import-Module <전체경로>로 수동 임포트 |
.dll/.psm1 파일 하나만 있는 경우 | 파일 경로를 직접 Import-Module에 지정 |
| 이름이 충돌하는 명령이 있는 모듈 | -Prefix(접두사 추가) 또는 -NoClobber(충돌 명령 제외) |
| 현재 세션에 로드된 모듈만 확인 | Get-Module(매개변수 없이) |
| 설치는 됐지만 아직 로드 안 된 모듈까지 확인 | Get-Module -ListAvailable |
예시
| |
주의사항·함정
Get-Command -Module이 자동 로딩을 유발하지만, 와일드카드가 있으면 그렇지 않다: Get-Command Get-CimInstance처럼 정확한 이름을 조회하면 해당 모듈이 자동으로 로드되지만, Get-Command Get-Cim*처럼 와일드카드를 쓰면 PowerShell은 어떤 모듈이 필요한지 확신할 수 없어 모듈을 로드하지 않는다 — 검색 목적으로 필요하지 않은 모듈까지 불필요하게 로드되는 것을 막기 위한 설계다.
Remove-Module은 모듈을 삭제하는 것이 아니라 세션에서만 내리는 것이다: 74장에서 설치한 모듈 파일 자체는 디스크에 그대로 남아 있고, Remove-Module은 단지 현재 세션에서 그 모듈이 추가한 명령·변수를 지우는 것뿐이다. 완전히 제거하려면 76장에서 다룰 Uninstall-Module이 필요하다.
이름이 같은 함수와 cmdlet이 공존하면 함수가 우선한다: 세션에 같은 이름의 함수와 cmdlet이 동시에 있으면 PowerShell은 기본적으로 함수를 실행한다. 어떤 소스의 명령이 실제로 실행되는지 확신이 서지 않는다면 Get-Command -All로 충돌 여부를 먼저 확인하는 습관이 안전하다 — 특히 여러 모듈을 조합해 쓰는 스크립트에서 흔히 발생하는 디버깅 함정이다.
Import-Module을 프로필에 넣지 않으면 매 세션마다 다시 실행해야 한다: 06장에서 다룬 $PROFILE에 자주 쓰는 모듈의 Import-Module 명령을 추가해 두면, 자동 로딩 대상이 아닌 모듈도 세션 시작 시 항상 준비된 상태로 만들 수 있다.
이식성: Bash의 source module.sh가 Import-Module과 개념적으로 가장 비슷하지만, “설치는 됐지만 아직 로드 안 된 모듈 목록"이라는 Get-Module -ListAvailable 같은 구분이나 자동 로딩 메커니즘은 없다. Python의 import 문이 처음 호출 시점에 자동으로 모듈을 찾아 로드한다는 점에서는 PowerShell의 자동 로딩과 비슷한 편의성을 제공한다.
![Featured image of post [PowerShell] 75. Import-Module/Get-Module/Remove-Module](/post/powershell/import-get-remove-module-powershell/wordcloud_hu_65d8095485077368.webp)
![[PowerShell] 73. Measure-Command — 성능 측정과 벤치마킹](/post/powershell/measure-command-benchmark-powershell/wordcloud_hu_b078f0ca79bf08ab.webp)
![[PowerShell] 74. 모듈 개념과 구조(.psm1/.psd1)](/post/powershell/module-structure-psm1-psd1-powershell/wordcloud_hu_7fca0b454a750e2a.webp)
![[PowerShell] 75. Import-Module/Get-Module/Remove-Module](/post/powershell/import-get-remove-module-powershell/wordcloud_hu_f7c6ed2cf0491565.webp)
![[PowerShell] 76. PowerShell Gallery — Install-Module/Find-Module](/post/powershell/powershell-gallery-install-find-module-powershell/wordcloud_hu_68568dc7c4947f25.webp)
![[PowerShell] 77. PowerShell 클래스(class 키워드)](/post/powershell/powershell-class-keyword-powershell/wordcloud_hu_5ff5e6ec1d4f4d49.webp)
![[PowerShell] 78. Start-Job/Get-Job/Receive-Job — 백그라운드 작업](/post/powershell/start-job-get-job-receive-job-powershell/wordcloud_hu_f975cbd44945c564.webp)
![[PowerShell] 79. ForEach-Object -Parallel(PowerShell 7+)](/post/powershell/foreach-object-parallel-threadjob-powershell/wordcloud_hu_30c9034b5b05c027.webp)