본문 바로가기
시스템(Windows)

PowerShell과 cmdlet 에 대해 알아보겠습니다.

by forward error correction Circle 2026. 2. 23.
반응형

 Ⅰ. PowerShell과 cmdlet 이란?

  ⅰ. PowerShell

     : 사용자가 입력한 명령을 해석하고 실행하며, 결과를 파이프라인으로 다음 명령에 전달하는 런타임/환경을 제공합니다. 또한 스크립트(.ps1)로 여러 명령을 묶어 자동화 작업을 만들 수 있습니다. Windows를 넘어 Linux·macOS까지 지원하는 크로스 플랫폼 자동화 셸이자 스크립팅 언어입니다.
  ⅱ. cmdlet

     : PowerShell 파이프라인 의미 체계에 참여하는 단일 명령으로, 보통 .NET 객체를 반환해 다음 명령으로 넘길 수 있게 설계되어 있습니다. Microsoft 문서에서도 cmdlet을 “PowerShell environment에서 사용되는 lightweight command”로 설명합니다. “동사-명사” 형식의 단일 작업 명령으로, 파일·서비스·프로세스·레지스트리·네트워크 등 다양한 리소스를 개체 단위로 제어가 가능합니다.

Ⅱ. Windows PowerShell 5.1 vs PowerShell 7.x 비교

구분 Windows PowerShell 5.1 
(powershell.exe)
PowerShell 7.x 
(pwsh.exe)
버전 윈도우 운영체제에 기본으로 포함된 버전 사용자가 직접 설치해서 쓰는 버전
기술 기반 윈도우 전용 기술인 .NET Framework 위에서 동작 (윈도우에서만 작동) 최신 기술인 .NET (Modern) 위에서 동작
(윈도우, 맥, 리눅스 모두 작동)

Ⅲ. cmdlet의 목적과 역할

ⅰ. cmdlet 목적
 기본적으로 ‘동사-명사(Verb-Noun)’ 규칙을 따릅니다. 그래서 처음 보는 명령도 “이게 조회인지(Get), 변경인지(Set), 생성인지(New)”처럼 역할을 쉽게 짐작할 수 있습니다. ​PowerShell은 파일 시스템뿐 아니라 레지스트리(HKLM:, HKCU:) 같은 데이터 저장소도 ‘드라이브’처럼 다루게 해주는 Provider/Drive 개념을 제공합니다. 이 덕분에 서로 성격이 다른 리소스도 비슷한 방식(경로 기반 탐색/조작)으로 관리할 수 있습니다. 예를 들어 “가져오기/조회”는 보통 Get-으로 시작하고, 뒤의 명사로 대상이 구분됩니다(예: Get-Process, Get-Service). 즉, 규칙을 한 번 익히면 새로운 cmdlet도 빠르게 적응할 수 있습니다.

ⅱ. cmdlet 역할
 1) 객체(Object) 전달(텍스트가 아니라 ‘데이터’를 넘김)
 전통적인 CLI는 결과를 텍스트로 출력하는 경우가 많아, 특정 값만 뽑으려면 자르기/정규식 같은 파싱 작업이 필요합니다.
반면 PowerShell cmdlet은 결과를 .NET 객체로 전달하는 것을 전제로 하며, 파이프라인에서도 객체가 그대로 흘러갑니다.
​그래서 {Name, Id, StartTime …}처럼 “속성을 가진 데이터 묶음”에서 필요한 속성만 선택하면 끝나고, 텍스트 가공에 덜 의존하므로 자동화가 더 안정적입니다.
 2) 파이프라인(|) 조립을 위한 부품
 PowerShell 파이프라인은 앞 cmdlet의 결과(객체)를 뒤 cmdlet이 하나씩 받아 처리하는 구조입니다. ​이 방식 덕분에 “조회 → 필터 → 정렬 → 선택” 같은 흐름을 조립하듯 연결할 수 있고, 각 cmdlet은 자기 역할에만 집중하는 ‘레고 블록’처럼 쓰입니다.
​ 3) 안전한 시스템 제어(실수 방지 장치)
 PowerShell은 변경 작업에서 -WhatIf(실행 대신 수행 예정 작업 표시), -Confirm(실행 전 확인) 같은 안전장치를 제공할 수 있는데, 이는 ShouldProcess 패턴에 기반합니다. ​함수/스크립트를 만드는 입장에서는 [CmdletBinding(SupportsShouldProcess)]를 선언해 사용자 정의 명령에도 동일한 안전장치를 붙일 수 있습니다

Ⅳ. cmdlet 설치 확인

 사실 이미 수백 개의 cmdlet이 기본으로 깔려 있습니다. 설치 없이 바로 아래 명령어를 쳐보세요.
 ⅰ. Get-Command : 내 컴퓨터에서 지금 바로 쓸 수 있는 모든 cmdlet 목록 보기
 ⅱ. Get-Command -Module Microsoft.PowerShell.Management : 파일/폴더 관리용 기본 cmdlet들만 보기

Ⅴ. cmdlet 카테고리

 ⅰ. 파일·폴더

  1) Get-Item, Get-ChildItem, Copy-Item, Move-Item, Remove-Item 등으로 파일 시스템 드라이브(C:, D: 등)를 다룹니다.
  2) 운영 작업 예: 로그 디렉터리 정리, 구성 파일 백업/배포, 디렉터리 구조 스캔 등 반복 작업을 스크립트로 고정화합니다.
​ ⅱ. 프로세스·서비스
  1) 프로세스

   Get-Process, Stop-Process 등으로 로컬/원격 프로세스 상태를 조회·종료할 수 있으며, ComputerName 매개변수로 여러 서버를 동시에 제어할 수 있습니다.
​  2) 서비스

   Get-Service, Start-Service, Stop-Service, Restart-Service 등으로 서비스 상태 점검과 재시작 절차를 스크립트에 녹여둘 수 있습니다.
 ⅲ. 레지스트리·구성
  1) HKLM, HKCU 와 같은 레지스트리 드라이브를 제공하고, 파일처럼 경로 기반으로 키·값을 조작할 수 있습니다.
  2) 운영 시에는 변경 전/후 상태를 Export-…/Get-ItemProperty 등으로 남겨 두어 롤백 근거를 확보하는 것이 좋습니다.
​ ⅳ. 네트워크·환경
  1) 네트워크: Test-Connection, Test-NetConnection, Get-NetAdapter 등으로 기본 진단·구성을 자동화할 수 있습니다.
  2) 환경·시스템 정보: Get-ChildItem Env:, Get-ComputerInfo 등으로 환경 변수와 시스템 정보를 수집해 인벤토리·헬스체크 스크립트를 만들 수 있습니다.

Ⅵ. cmdlet  기본 사용 패턴

 ⅰ. 명령 찾기: Get-Command로 이름/동사/모듈 기준으로 cmdlet을 검색해, “무엇이 있는지”부터 파악합니다.
​ ⅱ. 파이프라인: Get-… | Where-Object … | Select-Object … 패턴으로 조회 → 필터 → 투영을 구성하는 것이 PowerShell 스크립트의 핵심입니다.
 ⅲ. 도움말: Get-Help 명령과 Get-Help 명령 -Examples로 사용법과 실전 예제를 바로 확인하고, 필요하면 업데이트된 도움말을 내려받아 활용합니다.

Ⅶ. 안전한 변경 작업 템플릿

  ⅰ. -WhatIf

    : 실제로 실행하지 않고 무엇을 할지 시뮬레이션”하는 옵션입니다.

  ⅱ. -Confirm

    : 실행 전마다 사용자 확인 프롬프트를 띄워줍니다.
※ 파일 삭제, 레지스트리 수정, 서비스 중지처럼 리스크가 큰 작업에서는 명령 -WhatIf로 영향 범위를 먼저 검증하고,  -Confirm 또는 실제 실행 순서로 진행하는 패턴이 안전합니다.
※ CmdletBinding(SupportsShouldProcess=$true)를 선언하면 사용자 정의 함수에서도 -WhatIf/-Confirm을 지원하게 만들 수 있고, 운영자는 이를 표준 패턴으로 요구할 수 있습니다.

Ⅷ. 운영 환경에서의 주의사항

 ⅰ. 버전·호환성: 5.1 전용 cmdlet이나 오래된 API를 쓰는 모듈은 7.x에서 제거되거나 동작이 바뀐 경우가 있으므로, 이관 전 Import-Module -UseWindowsPowerShell 등 호환 옵션과 변경 목록을 확인해야 합니다.
 ⅱ. 모듈 출처 관리: PowerShell은 모듈로 기능이 확장되므로, 운영망에서는 공식/사내 검증 모듈만 사용하고 버전·배포 경로·서명을 관리하는 정책이 필요합니다.
 ⅲ. 텍스트가 아닌 개체: 출력이 개체라는 점을 전제로, 문자열 파싱 대신 속성 기반 처리(Get-Member → Select-Object 등)를 사용하는 것이 유지보수성과 안정성 측면에서 유리합니다.


반응형