개요
#Requires는 스크립트가 실행되기도 전에 PowerShell 버전·필요 모듈·관리자 권한 같은 전제 조건을 검사해, 조건이 안 맞으면 스크립트를 아예 시작하지 못하게 막는 특수 주석이다. 53장에서 스크립트를 작성하고 실행하는 법을 배운 뒤, 61장까지 함수와 파이프라인 바인딩으로 스크립트의 내부 로직을 다듬어 왔다면, 이 장은 그 스크립트가 애초에 잘못된 환경에서 실행되는 것 자체를 막는 마지막 안전장치를 다루며 Part 6을 마무리한다.
정신 모델은 “#Requires는 스크립트 본문이 시작하기 전에 실행되는, 실패하면 아예 진입을 거부하는 문지기"라는 것이다. 이는 스크립트 본문 안에서 if ($PSVersionTable.PSVersion -lt ...) { throw ... }처럼 직접 검사하는 것과 달리, PowerShell 엔진 수준에서 강제된다.
사용법
| |
종류
| 매개변수 | 검사 내용 |
|---|---|
-Version | 최소 PowerShell 버전(예: 6.0) |
-Modules | 필요한 모듈(문자열, 또는 ModuleVersion/RequiredVersion/MaximumVersion을 가진 해시테이블) |
-PSEdition | Core(PowerShell 7/pwsh) 또는 Desktop(Windows PowerShell 5.1) — 01장에서 다룬 두 에디션 구분과 직결 |
-RunAsAdministrator | 관리자 권한으로 시작된 세션이어야 함(비Windows에서는 무시됨) |
예시
| |
| |
주의사항·함정
#Requires는 스크립트 안 어디에 적어도 전역적으로 먼저 검사된다: 코드 순서상 스크립트 첫 줄에서 필요한 모듈을 Remove-Module로 제거한 뒤 그 아래에 #Requires -Modules를 적더라도, 검사 자체는 스크립트가 시작되기 전에 이미 통과한 상태이므로 실행 자체는 막히지 않는다. #Requires의 위치는 가독성의 문제일 뿐, 실행 순서에 영향을 주지 않는다는 점을 오해하기 쉽다.
모듈 버전 문자열은 정확히 일치해야 한다: RequiredVersion = "0.12"처럼 실제 설치된 버전(“0.12.0”)과 자릿수가 다르면 검사가 실패한다. Get-Module -ListAvailable로 정확한 버전 문자열을 확인한 뒤 그대로 옮겨 적어야 한다.
-RunAsAdministrator는 비Windows 플랫폼에서 조용히 무시된다: 크로스플랫폼 스크립트(1장에서 다룬 PowerShell 7의 특징)를 작성한다면, 이 지시문 하나만으로는 macOS·Linux에서 관리자 권한(sudo) 여부를 검사할 수 없다는 점을 감안해야 한다. 플랫폼을 가리지 않는 권한 검사가 필요하다면 별도의 코드로 직접 확인해야 한다.
#Requires -Modules는 클래스·열거형 정의까지 불러오지는 않는다: 모듈이 있는지만 확인하고 세션에 임포트할 뿐, 그 모듈 안에 정의된 사용자 정의 클래스·열거형(77장에서 다룰 class 키워드)을 실제로 사용하려면 using module 문을 스크립트 맨 앞에 별도로 추가해야 한다.
이식성: Bash·CMD에는 #Requires에 해당하는 표준화된 전제 조건 검사 문법이 없어, 스크립트 맨 앞에 버전이나 명령 존재 여부를 수동으로 검사하는 관용구(command -v git, if not exist ...)를 직접 작성해야 한다. PowerShell은 이런 검사를 언어 차원의 선언적 지시문으로 표준화해, 스크립트를 열어 보지 않고도 Get-Help나 정적 분석 도구(72장의 PSScriptAnalyzer)가 요구 사항을 파악할 수 있게 한다.
![Featured image of post [PowerShell] 64. #Requires 지시문과 스크립트 메타데이터](/post/powershell/requires-directive-metadata-powershell/wordcloud_hu_9783266a86b453cd.webp)
![[PowerShell] 62. 스코프(Scope) — 전역/지역/스크립트](/post/powershell/scope-global-local-script-powershell/wordcloud_hu_59e4df2abadaaec.webp)
![[PowerShell] 63. 스크립트 블록과 클로저](/post/powershell/script-block-closure-powershell/wordcloud_hu_dee8c4c3bb9b3775.webp)
![[PowerShell] 64. #Requires 지시문과 스크립트 메타데이터](/post/powershell/requires-directive-metadata-powershell/wordcloud_hu_9e51949b0b697e4.webp)
![[PowerShell] 65. try/catch/finally — 예외 처리](/post/powershell/try-catch-finally-exception-powershell/wordcloud_hu_a322ce3572196406.webp)
![[PowerShell] 66. $ErrorActionPreference와 -ErrorAction/-ErrorVariable](/post/powershell/erroractionpreference-command-powershell/wordcloud_hu_40455d890fde6e66.webp)
![[PowerShell] 41. 변수와 데이터 타입](/post/powershell/variables-data-types-powershell/wordcloud_hu_6051f7a36d4700ee.webp)
![[PowerShell] 42. 배열과 컬렉션 기초](/post/powershell/arrays-collections-powershell/wordcloud_hu_c295cc73d4592ae5.webp)
![[PowerShell] 43. ArrayList와 Generic List(List<T>)](/post/powershell/arraylist-generic-list-powershell/wordcloud_hu_a34550a6370cee87.webp)
![[PowerShell] 44. 해시테이블(Hashtable) 다루기](/post/powershell/hash-tables-powershell/wordcloud_hu_d1fd29269ce3c32d.webp)
![[PowerShell] 45. 문자열 서식과 Here-String](/post/powershell/string-formatting-here-string-powershell/wordcloud_hu_6a3265810b79b68e.webp)