개요
PSScriptAnalyzer는 스크립트를 실제로 실행하지 않고 코드 자체를 정적으로 분석해 잠재적 결함·나쁜 관례를 찾아내는 도구다. 71장의 Pester가 “이 함수가 실제로 옳게 동작하는가"를 실행을 통해 검증했다면, PSScriptAnalyzer는 “이 코드에 흔히 문제를 일으키는 패턴이 있는가"를 실행 없이 코드 구조만 보고 판단한다는 점에서 역할이 다르다 — 두 도구는 경쟁 관계가 아니라 서로 다른 층위를 보완하는 관계다.
정신 모델은 “PSScriptAnalyzer는 PowerShell 팀과 커뮤니티가 정리한 모범 사례를 규칙(Rule) 목록으로 만들어, 코드가 그 규칙을 어기는지 하나씩 대조하는 검사기"라는 것이다.
사용법
| |
종류
| 개념 | 설명 |
|---|---|
| 내장 규칙 | 초기화 안 된 변수 사용, PSCredential 타입 오용, Invoke-Expression 남용 등 수십 개 |
-Severity | Error/Warning/Information으로 결과 필터링 |
-IncludeRule / -ExcludeRule | 특정 규칙만 검사하거나 제외 |
-Recurse | 디렉터리 전체의 .ps1/.psm1 파일을 재귀적으로 검사 |
| 자동 서식 교정 | 일부 규칙은 검사뿐 아니라 코드 서식을 표준에 맞게 자동으로 고쳐 줌 |
예시
| |
주의사항·함정
PSScriptAnalyzer는 “실행 가능한 코드"와 “좋은 코드"를 다른 기준으로 판단한다: 문법 오류가 전혀 없어 정상적으로 실행되는 스크립트도, Write-Host 남용이나 초기화되지 않은 변수 참조 같은 관례 위반이 있으면 경고를 낸다. “일단 돌아가니까 괜찮다"와 “유지보수하기 좋은 코드다"는 서로 다른 질문이라는 점을 이 도구가 계속 상기시켜 준다.
규칙을 무조건 전부 따르는 것이 항상 정답은 아니다: 예를 들어 대화형 스크립트에서 의도적으로 Write-Host를 쓰는 경우처럼, 프로젝트의 맥락에 따라 특정 규칙이 오히려 부적절할 수 있다. -ExcludeRule로 팀이 합의한 예외를 명시적으로 배제하는 것이 “규칙을 무시한 채 경고를 방치하는 것"보다 안전하다 — 의도가 코드에 남기 때문이다.
정적 분석은 논리적 오류까지 잡아내지는 못한다: PSScriptAnalyzer는 코드의 형태를 검사할 뿐, “이 함수가 계산 로직을 실제로 올바르게 구현했는가"는 검사하지 못한다. 이 부분은 71장의 Pester가 담당하는 영역이며, 실무에서는 두 도구를 함께 CI 파이프라인에 넣어 상호 보완적으로 쓴다.
이식성: Python의 pylint/flake8, JavaScript의 ESLint가 개념적으로 정확히 대응하는 도구다 — 세 언어 생태계 모두 “실행 전에 코드 관례를 자동으로 점검한다"는 같은 아이디어를 채택했다. Bash에는 shellcheck이 유사한 역할을 하지만, CMD 배치 스크립트에는 이에 준하는 표준화된 정적 분석 도구가 마땅치 않다.
![Featured image of post [PowerShell] 72. PSScriptAnalyzer — 정적 분석과 코딩 규칙](/post/powershell/psscriptanalyzer-static-analysis-powershell/wordcloud_hu_24176488a5e4de58.webp)
![[PowerShell] 70. Set-PSBreakpoint — 스크립트 디버깅](/post/powershell/set-psbreakpoint-debugging-powershell/wordcloud_hu_ce0529ad2ee3374e.webp)
![[PowerShell] 71. Pester 소개 — Describe/It/Should](/post/powershell/pester-describe-it-should-powershell/wordcloud_hu_65e0d7d8ff97f59.webp)
![[PowerShell] 72. PSScriptAnalyzer — 정적 분석과 코딩 규칙](/post/powershell/psscriptanalyzer-static-analysis-powershell/wordcloud_hu_fb1acde140a2de4f.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] 114. New-Guid/Get-Random — 유틸리티 모음](/post/powershell/new-guid-get-random-utility-powershell/wordcloud_hu_e9ded1c7c447f201.webp)
![[PowerShell] 00. 과정 개요와 커리큘럼](/post/powershell/getting-started-powershell/wordcloud_hu_15979a96cd2a594f.webp)
![[PowerShell] 100. Get-Credential과 PSCredential 객체](/post/powershell/get-credential-pscredential-object-powershell/wordcloud_hu_e8db052a57f9c242.webp)