PowerShell 코드 완전 정리: 기초부터 활용까지

PowerShell 소개: 왜 배워야 하는가

PowerShell은 마이크로소프트가 2006년에 최초로 출시한 태스크 자동화 프레임워크이자 커맨드라인 셸입니다. .NET 플랫폼 위에 구축된 이 도구는 시스템 관리자와 개발자에게 강력한 스크립팅 환경을 제공합니다. 기존의 cmd.exe가 텍스트 기반 파이프라인에 의존한 반면, PowerShell은 객체 기반 파이프라인을 사용합니다. 이는 명령어 실행 결과가 텍스트가 아닌 .NET 객체로 전달된다는 의미입니다. 따라서 데이터를 가공, 필터링, 정렬하는 작업이 훨씬 직관적이고 효율적입니다. PowerShell은 초기 코드명이 Monad였으며, 2016년에 오픈소스로 전환되어 PowerShell Core로 발전했습니다. 현재는 Windows, Linux, macOS에서 모두 실행 가능한 크로스 플랫폼 도구로 자리 잡았습니다.

PowerShell을 배우면 수작업으로 처리하던 반복적인 시스템 관리 작업을 자동화할 수 있습니다. 예를 들어 수백 대의 서버에서 프로세스 상태를 확인하거나 이벤트 로그를 분석하는 작업을 단일 스크립트로 처리할 수 있습니다. 또한 Active Directory 관리, 클라우드 리소스 제어, 네트워크 설정 변경 등 다양한 영역에서 사용됩니다. 초보자에게는 학습 곡선이 다소 가파를 수 있지만, 기본 개념만 이해하면 생산성을 극적으로 향상시킬 수 있습니다.

이 문서에서는 PowerShell 코드를 기초부터 실전 활용까지 체계적으로 정리합니다. 명령어와 스크립트 구조, 유용한 cmdlet, 보안 설정, 실제 사례를 다룹니다. 특히 시스템 관리자와 DevOps 엔지니어가 자주 사용하는 코드 패턴에 중점을 둡니다.

PowerShell 기본 명령어와 cmdlet 이해

PowerShell의 핵심은 cmdlet이라고 불리는 경량 명령어입니다. 모든 cmdlet은 동사-명사 형태를 따릅니다. 예를 들어 Get-Process는 실행 중인 프로세스를 조회하고, Set-Location은 현재 작업 디렉토리를 변경합니다. 이러한 일관된 명명 규칙 덕분에 사용자는 명령어를 쉽게 유추하고 기억할 수 있습니다. 가장 기본적인 cmdlet은 Get-Help로, 다른 cmdlet의 사용법과 매개변수를 확인할 수 있습니다. Get-Hello와 같은 틀린 명령어를 입력해도 PowerShell이 유사한 명령어를 제안하는 기능이 있습니다.

PowerShell 코드 완전 정리: 기초부터 활용까지 - 1

유용한 cmdlet 목록을 정리하면 다음과 같습니다.

  • Get-Service: Windows 서비스의 상태를 조회합니다. 예를 들어 Get-Service -Name Spooler를 입력하면 프린트 스풀러 서비스의 실행 여부를 확인할 수 있습니다.
  • Get-EventLog: 이벤트 로그에 기록된 시스템 및 애플리케이션 이벤트를 읽습니다. -LogName Application이나 -LogName Security와 같은 매개변수로 특정 로그를 대상으로 지정할 수 있습니다.
  • Get-Process: 실행 중인 프로세스 목록과 CPU 사용량, 메모리 점유율을 보여줍니다. Stop-Process cmdlet과 함께 사용하면 특정 프로세스를 종료할 수 있습니다.
  • Get-ADUser와 Get-ADComputer: Active Directory 모듈이 설치된 환경에서 사용자 계정과 컴퓨터 계정 정보를 조회합니다. 필터를 적용하여 특정 조건에 맞는 객체만 가져올 수 있습니다.
  • Set-ExecutionPolicy: PowerShell 스크립트 실행 정책을 제어합니다. 기본적으로 Restricted 상태로 설정되어 있어 .ps1 파일이 실행되지 않습니다.

이러한 cmdlet은 파이프라인(|)을 통해 연결할 수 있습니다. 예를 들어 Get-Process | Where-Object {$_.WorkingSet -gt 100MB}는 작업 세트가 100MB를 초과하는 프로세스만 필터링합니다. 객체 기반 파이프라인의 강력함을 보여주는 예시입니다.

스크립트 작성: 변수, 조건문, 반복문

PowerShell 스크립트 파일 확장자는 .ps1입니다. 스크립트 내에서 변수는 $ 기호로 선언합니다. 예를 들어 $UserName = "admin"과 같이 사용합니다. 변수에는 어떤 .NET 객체든 할당할 수 있으며, 숫자, 문자열, 배열, 해시 테이블 등이 모두 가능합니다. 조건문은 if, else, elseif, switch를 사용합니다. switch 문은 여러 조건을 간결하게 처리할 때 유용합니다.

반복문으로는 for, foreach, while, do-while을 지원합니다. foreach는 컬렉션의 각 요소를 순회할 때 가장 많이 사용됩니다. 예를 들어 서비스 목록을 가져와서 중지된 서비스만 다시 시작하는 스크립트를 작성할 수 있습니다. 다음은 간단한 예제입니다.

PowerShell 코드 완전 정리: 기초부터 활용까지 - 2

Get-Service | ForEach-Object { if ($_.Status -eq 'Stopped') { Start-Service $_.Name } }

이 코드는 모든 서비스를 검사하여 중지된 경우 시작 명령을 실행합니다. 실제 작업 환경에서는 더 복잡한 로직이 필요하지만, 기본 패턴은 동일합니다.

스크립트를 모듈화하려면 함수를 정의할 수 있습니다. function 키워드를 사용하고, 매개변수와 반환 값을 지정합니다. 스크립트 블록(중괄호)과 영역 구분을 신경 쓰면 가독성이 좋아집니다.

실전 활용: Active Directory 자동화 예제

Active Directory(AD) 환경에서 PowerShell은 매우 유용합니다. Get-ADUser cmdlet을 사용하면 사용자 계정 정보를 조회할 수 있으며, 필터와 속성 지정이 가능합니다. 예를 들어 최근 7일 이내에 생성된 사용자 계정을 찾으려면 다음과 같은 코드를 사용합니다.

PowerShell 코드 완전 정리: 기초부터 활용까지 - 3

$Fecha = (Get-Date).AddDays(-7)

Get-ADUser -Filter {whenCreated -ge $Fecha} -Properties Name, Enabled, whenCreated

이 스크립트는 오늘 날짜에서 7일을 뺀 날짜를 변수에 저장하고, whenCreated 값이 그 이후인 모든 사용자 계정을 반환합니다. 결과에는 이름, 활성화 여부, 생성일이 포함됩니다. AD 모듈을 사용하려면 Import-Module ActiveDirectory를 먼저 실행해야 할 수 있습니다.

실제 업무에서는 이러한 코드를 확장하여 보고서를 생성하거나, 비활성 계정을 일괄 처리하는 데 사용할 수 있습니다. 또한 Get-ADComputer를 이용하여 특정 기간 동안 로그인하지 않은 컴퓨터를 찾아 정리하는 작업도 가능합니다.

PowerShell 코드 완전 정리: 기초부터 활용까지 - 4

PowerShell 원격 세션 기능을 이용하면 여러 도메인 컨트롤러에 동시에 명령을 실행할 수도 있습니다. 하지만 보안을 위해 WinRM(Windows Remote Management) 서비스가 활성화되어 있어야 하고, 적절한 권한이 필요합니다.

보안과 실행 정책: 스크립트 배포의 핵심

PowerShell 스크립트를 실행할 때 보안은 중요한 고려 사항입니다. 기본 실행 정책(Execution Policy)은 Restricted로, 어떤 .ps1 파일도 실행되지 않습니다. 이를 변경하려면 Set-ExecutionPolicy cmdlet을 사용합니다. 옵션으로는 RemoteSigned(로컬 스크립트는 허용, 인터넷에서 다운로드한 스크립트는 서명 필요), AllSigned(모든 스크립트에 서명 필요), Unrestricted(모든 스크립트 실행 가능) 등이 있습니다.

관리자는 일반적으로 RemoteSigned로 설정합니다. 이렇게 하면 로컬에서 작성한 스크립트는 자유롭게 실행할 수 있고, 외부에서 가져온 스크립트는 신뢰할 수 있는 게시자의 서명을 요구합니다. 실행 정책은 레지스트리에 저장되며, Scope 매개변수로 CurrentUser, LocalMachine, Process 등 적용 범위를 지정할 수 있습니다.

보안 모범 사례는 다음과 같습니다.

PowerShell 코드 완전 정리: 기초부터 활용까지 - 5
실행 정책설명권장 사용
Restricted스크립트 실행 불가초보자 또는 테스트 환경
RemoteSigned로컬 스크립트 허용, 원격 스크립트는 서명 필요일반적인 운영 환경
AllSigned모든 스크립트에 서명 필요보안이 중요한 엔터프라이즈
Unrestricted모든 스크립트 실행 허용 (경고 표시)비권장

스크립트를 서명하려면 Set-AuthenticodeSignature cmdlet을 사용하고, 인증서가 필요합니다. 대규모 조직에서는 코드 서명 인프라를 구축하는 것이 좋습니다.

PowerShell Core와 Windows PowerShell 비교

PowerShell Core(6.0 이상)는 .NET Core를 기반으로 한 오픈소스 버전으로, Windows, Linux, macOS에서 실행됩니다. 반면 Windows PowerShell(5.1 이하)은 Windows 전용이며 .NET Framework가 필요합니다. PowerShell Core는 기본적으로 크로스 플랫폼을 지향하므로 Linux 서버나 컨테이너 환경에서도 동일한 스크립트를 사용할 수 있습니다.

하지만 모든 cmdlet이 PowerShell Core에서 지원되는 것은 아닙니다. 예를 들어 Get-EventLog와 같은 일부 Windows 전용 cmdlet은 Windows PowerShell에서만 사용할 수 있습니다. Active Directory 모듈도 Windows PowerShell에서는 기본 제공되지만, PowerShell Core에서는 RSAT(원격 서버 관리 도구)를 설치하거나 다른 방법을 사용해야 합니다.

호환성을 위해서는 스크립트 작성 시 #Requires -Version 5.1과 같은 지시문을 추가하거나, 조건부 로직으로 플랫폼을 확인하는 것이 좋습니다. 점차 많은 조직이 PowerShell Core로 마이그레이션하고 있지만, 기존 Windows PowerShell 스크립트가 많다면 병행 사용을 고려해야 합니다.

PowerShell 코드 최적화와 디버깅 팁

스크립트 성능을 높이려면 불필요한 파이프라인 사용을 줄이고, 필터를 조기에 적용하는 것이 중요합니다. Where-Object는 전체 데이터를 받은 후 필터링하므로, 가능하면 cmdlet 자체의 필터 매개변수를 사용하는 것이 더 빠릅니다. 예를 들어 Get-Service -Name *Spool*처럼 직접 필터를 지정하는 것입니다.

디버깅에는 Write-Host 대신 Write-Verbose, Write-Debug, Write-Warning을 사용하는 것이 좋습니다. 이들은 스크립트 실행 흐름을 제어하고, Verbose 매개변수로 상세 출력을 확인할 수 있습니다. Set-PSBreakpoint를 이용하면 특정 줄이나 변수에 중단점을 설정할 수 있습니다. PowerShell ISE나 Visual Studio Code의 확장 기능을 활용하면 그래픽 디버깅도 가능합니다.

또한 트랜잭션 로그를 작성하거나 try-catch-finally 블록을 사용하여 오류 처리 로직을 포함시키는 것이 안정적인 스크립트의 핵심입니다. $Error 변수에는 마지막 오류 정보가 저장되므로 이를 활용하여 조건부 분기를 만들 수 있습니다.

시스템을 변경하는 스크립트는 반드시 -WhatIf 매개변수를 지원하도록 작성하는 것이 모범 사례입니다. 이 매개변수를 사용하면 실제 변경 없이 미리보기만 제공하므로 안전합니다.

참고 자료

이 문서에서 다룬 내용은 아래 출처를 기반으로 작성되었습니다. Microsoft Learn에서 제공하는 공식 문서는 PowerShell의 각 cmdlet과 스크립팅 언어 사양에 대한 상세한 정보를 제공합니다. IONOS 디지털 가이드는 실무에서 자주 사용하는 cmdlet 목록을 정리한 유용한 자료입니다. Wikipedia 페이지는 PowerShell의 역사와 아키텍처 개요를 이해하는 데 도움을 줍니다. GitHub 저장소에서는 PowerShell Core의 오픈소스 코드와 릴리스 노트를 확인할 수 있습니다. 필요에 따라 각 링크를 방문하여 더 구체적인 사용법을 확인하시기 바랍니다.

PowerShell 코드 스크립트 자동화 Windows 시스템관리 명령줄 개발
주의 본 내용은 일반 정보 제공용이며 환경에 따라 동작이 다를 수 있습니다.
작성자

Stefano Barcellos

Visite Barbados 기여자.

« 이전 글
드라이버 업데이트 방법과 최신 버전 설치 가이드

관련 글