2025년 8월 10일 일요일

윈도우 PowerShell 스크립트 작성: 시스템 자동화, 완벽 가이드

마우스를 클릭하고 메뉴를 오가며 PC를 사용하는 것에 지치셨나요? 반복적인 작업 때문에 시간을 낭비하고 있진 않으신가요? 윈도우 환경에서 단순한 명령어를 넘어 시스템의 모든 것을 손쉽게 제어하고 자동화할 수 있는 강력한 도구가 있습니다. 바로 윈도우 PowerShell입니다. 많은 사람들이 단순히 '검은 화면'이라고 생각하지만, PowerShell은 여러분의 PC를 진정한 '나만의 것'으로 만들어주는 마법 같은 도구입니다.

이 글은 PowerShell을 처음 접하는 초보자부터, 더욱 효율적인 시스템 관리를 원하는 숙련자까지 모두를 위한 완벽한 가이드입니다. PowerShell이 왜 기존의 명령 프롬프트와 다른지, 간단한 스크립트 작성법부터 시작해 실무에서 바로 활용할 수 있는 다양한 예시, 그리고 한 단계 더 나아간 심화 기술까지 모든 것을 총망라했습니다. 이 글을 통해 여러분도 PowerShell을 활용하여 PC를 자유자재로 다루고, 반복적인 작업을 한 번에 해결하는 시스템 제어의 끝판왕으로 거듭날 수 있을 것입니다.

1. 윈도우 PowerShell, 왜 '끝판왕'인가?

PowerShell은 단순히 명령을 입력하고 결과를 텍스트로 받는 기존의 명령 프롬프트(CMD)와는 근본적으로 다릅니다. PowerShell은 윈도우의 강력한 객체 지향 셸(Shell)이자 스크립팅 언어입니다.

1-1. 객체 지향 기반의 혁신

기존 명령 프롬프트는 모든 결과를 단순히 '텍스트'로만 처리했습니다. 예를 들어, 특정 파일 목록을 확인하려면 그저 텍스트 형태의 목록을 출력하고, 이 텍스트를 다시 가공해야만 했습니다. 하지만 PowerShell은 모든 결과를 '객체(Object)'로 반환합니다.

객체에는 단순한 이름뿐만 아니라 크기, 생성 날짜, 소유자 등 다양한 속성(Property)과 메서드(Method)가 포함되어 있습니다. 이러한 객체를 다음 명령어로 쉽게 넘겨주는 것이 바로 **파이프라인(|)**입니다. 이 객체 지향 방식 덕분에 PowerShell은 훨씬 더 강력하고 유연한 데이터 처리를 가능하게 합니다.

1-2. 통합된 관리 환경과 크로스 플랫폼 지원

PowerShell은 윈도우 운영체제의 모든 요소를 관리할 수 있도록 설계되었습니다. 레지스트리, 서비스, 파일 시스템, 사용자 계정 등 윈도우 시스템의 거의 모든 부분을 PowerShell 명령어로 제어할 수 있습니다.

또한, 현재의 PowerShell은 PowerShell 7을 기준으로 윈도우뿐만 아니라 맥OS, 리눅스에서도 사용할 수 있는 크로스 플랫폼 도구로 발전했습니다. 이는 하나의 스크립트로 윈도우 PC와 리눅스 서버, 심지어 클라우드 환경까지 통합적으로 관리할 수 있음을 의미합니다.

2. PowerShell 스크립트 작성, 이제 시작해볼까요? (기본편)

PowerShell 스크립팅은 복잡해 보이지만, 몇 가지 기본 개념만 익히면 누구나 쉽게 시작할 수 있습니다.

2-1. 스크립트 편집기 설정

PowerShell 스크립트 작성에 가장 널리 사용되는 도구는 Visual Studio Code입니다.

  1. Visual Studio Code를 설치합니다.

  2. Visual Studio Code를 실행한 후, 확장(Extensions) 탭에서 'PowerShell'을 검색하여 설치합니다.

  3. 이제 새로운 파일에 MyScript.ps1과 같이 확장자를 ps1로 지정하여 스크립트 파일을 만들 수 있습니다.

2-2. 첫 번째 스크립트 작성

스크립트의 가장 기본은 화면에 글자를 출력하는 것입니다. PowerShell에서는 Write-Host라는 명령어를 사용합니다.

PowerShell
# 이 부분은 주석입니다. 스크립트 실행에 영향을 주지 않습니다.
# 화면에 메시지를 출력하는 스크립트

Write-Host "안녕하세요, PowerShell 스크립팅의 세계에 오신 것을 환영합니다!"

[스크립트 실행 시 주의할 점]

PowerShell 스크립트는 보안상의 이유로 기본적으로 실행이 차단되어 있습니다. 스크립트를 실행하려면 터미널에 아래 명령어를 입력하여 실행 정책을 변경해야 합니다.

PowerShell
Set-ExecutionPolicy RemoteSigned

RemoteSigned는 로컬에서 작성한 스크립트는 자유롭게 실행하고, 인터넷에서 다운로드한 스크립트는 디지털 서명이 있는 경우에만 실행하도록 허용하는 정책입니다. 이 설정을 적용하면 스크립트를 안전하게 실행할 수 있습니다.

2-3. 변수와 파이프라인의 이해

  • 변수: PowerShell에서는 $변수이름 형식으로 변수를 선언합니다.

    PowerShell
    # 변수에 값 할당
    $myText = "이것은 변수입니다."
    Write-Host $myText
    
  • 파이프라인(|): 파이프라인은 한 명령어의 출력을 다음 명령어의 입력으로 전달하는 핵심 기능입니다.

    PowerShell
    # 현재 실행 중인 모든 프로세스를 가져옵니다.
    Get-Process
    
    # 파이프라인을 사용해 특정 프로세스만 필터링합니다.
    # 이름이 "chrome"인 모든 프로세스를 가져와서 화면에 출력합니다.
    Get-Process | Where-Object { $_.ProcessName -eq "chrome" }
    

    위 예시에서 $_는 파이프라인으로 전달된 현재 객체(이 경우, 하나의 프로세스)를 의미합니다. 이처럼 객체 기반의 파이프라인은 텍스트를 처리하는 것보다 훨씬 직관적이고 강력합니다.

3. 실무에서 바로 써먹는 PowerShell 스크립트 (활용편)

이제 기본적인 문법을 바탕으로 실생활과 업무에서 유용하게 사용할 수 있는 스크립트 예시들을 살펴보겠습니다.

3-1. 시스템 정보 수집 및 리포트 작성

PC의 상태를 한눈에 확인하는 스크립트입니다.

PowerShell
# 시스템 정보 수집 스크립트
$osInfo = Get-CimInstance -ClassName Win32_OperatingSystem
$cpuInfo = Get-CimInstance -ClassName Win32_Processor
$memoryInfo = Get-CimInstance -ClassName Win32_ComputerSystem
$diskInfo = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3"

Write-Host "================== 시스템 정보 =================="
Write-Host "운영체제: $($osInfo.Caption)"
Write-Host "설치 날짜: $($osInfo.InstallDate)"
Write-Host "CPU 모델: $($cpuInfo.Name)"
Write-Host "물리적 메모리: $([Math]::Round($memoryInfo.TotalPhysicalMemory/1GB, 2)) GB"
Write-Host "================================================="
Write-Host "               디스크 정보"
Write-Host "-------------------------------------------------"

$diskInfo | ForEach-Object {
    $freeGB = [Math]::Round($_.FreeSpace / 1GB, 2)
    $sizeGB = [Math]::Round($_.Size / 1GB, 2)
    Write-Host "드라이브 $($_.DeviceID) - 용량: ${sizeGB} GB, 남은 공간: ${freeGB} GB"
}

3-2. 오래된 파일 자동 삭제

특정 폴더에 있는 오래된 파일들을 자동으로 찾아 삭제하는 스크립트입니다. 로그 파일이나 임시 파일 관리에 매우 유용합니다.

PowerShell
# 30일이 지난 파일 삭제 스크립트
$targetPath = "C:\Temp\Logs" # 삭제할 폴더 경로를 지정하세요.
$days = 30 # 삭제할 파일의 기준 일수 (30일)

Write-Host "$targetPath 폴더에서 ${days}일이 지난 파일을 찾습니다..."

# 30일이 지난 파일들을 찾아 리스트업합니다.
Get-ChildItem -Path $targetPath -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$days) } | ForEach-Object {
    # 찾은 파일의 경로를 출력합니다.
    Write-Host "삭제 대상 파일: $($_.FullName)"
    
    # 파일을 삭제합니다.
    Remove-Item -Path $_.FullName -Force
}

Write-Host "삭제 작업이 완료되었습니다."

3-3. 윈도우 서비스 상태 확인 및 재시작

특정 윈도우 서비스가 중단되었을 때 자동으로 다시 시작하는 스크립트입니다. 서비스가 필요한 환경에서 시스템 안정성을 높여줍니다.

PowerShell
# 특정 서비스 상태 확인 및 재시작 스크립트
$serviceName = "Spooler" # 관리할 서비스 이름을 입력하세요. (예: Spooler)

Write-Host "$serviceName 서비스 상태를 확인합니다..."

# 서비스 상태를 가져옵니다.
$service = Get-Service -Name $serviceName

if ($service.Status -eq "Stopped") {
    Write-Host "$serviceName 서비스가 중지되었습니다. 서비스를 재시작합니다."
    
    # 서비스를 재시작합니다.
    Start-Service -Name $serviceName
    Write-Host "$serviceName 서비스가 성공적으로 재시작되었습니다."
} else {
    Write-Host "$serviceName 서비스가 현재 실행 중입니다."
}

4. PowerShell 스크립팅, 한 단계 더 깊이 들어가기 (심화편)

PowerShell의 진정한 힘은 반복되는 작업을 자동화하고, 더 복잡한 로직을 구현할 수 있는 심화 기능에서 나옵니다.

4-1. 함수와 모듈의 개념

자주 사용하는 스크립트 코드를 함수로 만들면 재사용성이 높아집니다. 여러 함수를 묶어 하나의 파일로 만든 것을 모듈이라고 합니다.

PowerShell
# 간단한 함수 정의
function Get-MyIP {
    $ip = (Invoke-RestMethod -Uri "http://ipinfo.io/json").ip
    return $ip
}

# 함수 호출
$myPublicIP = Get-MyIP
Write-Host "나의 공인 IP 주소: $myPublicIP"

위 함수처럼 자주 쓰는 기능을 모아 모듈로 만들고, Import-Module 명령어로 불러와 사용할 수 있습니다.

4-2. 원격 관리(Remoting)의 활용

PowerShell은 네트워크를 통해 다른 PC의 시스템을 원격으로 관리할 수 있는 강력한 기능을 제공합니다.

PowerShell
# 원격 PC의 서비스 상태를 확인합니다.
Invoke-Command -ComputerName "RemotePC01" -ScriptBlock {
    Get-Service -Name "Spooler"
}

Invoke-Command는 원격 PC에서 스크립트를 실행하고 그 결과를 현재 PC로 가져오는 명령어입니다.

4-3. 오류 처리(Error Handling)

스크립트 실행 중 발생할 수 있는 오류를 미리 방지하고, 오류 발생 시 정해진 동작을 수행하도록 하는 것이 중요합니다.

PowerShell
# 오류 처리 예시
Try {
    # 존재하지 않는 파일에 접근 시도
    Get-Content -Path "C:\nonexistent_file.txt" -ErrorAction Stop
}
Catch {
    Write-Host "오류가 발생했습니다: $($_.Exception.Message)"
}
Finally {
    Write-Host "스크립트가 종료되었습니다."
}

Try 블록에서 오류가 발생하면 Catch 블록이 실행됩니다. Finally 블록은 오류 발생 여부와 관계없이 항상 실행됩니다.

4-4. 스케줄러(Task Scheduler)를 통한 자동화

작성한 PowerShell 스크립트를 윈도우의 '작업 스케줄러'에 등록하면, 특정 시간이나 조건에 맞춰 자동으로 실행되도록 설정할 수 있습니다.

  1. '시작' 메뉴에서 '작업 스케줄러'를 검색하여 실행합니다.

  2. '기본 작업 만들기'를 클릭하고, 스크립트를 실행할 시간을 설정합니다.

  3. '작업' 단계에서 '프로그램 시작'을 선택합니다.

  4. '프로그램/스크립트'에는 powershell.exe를, '인수 추가'에는 -File "C:\Path\To\YourScript.ps1"과 같이 스크립트 파일의 전체 경로를 입력합니다.

5. PowerShell 스크립트 작성 시 주의할 점과 팁

PowerShell은 강력한 만큼 주의해서 다루어야 합니다. 안전하고 효율적인 스크립팅을 위한 몇 가지 팁입니다.

  • 스크립트 실행 정책은 반드시 확인하세요: 보안을 위해 Set-ExecutionPolicy를 통해 적절한 실행 정책을 설정하는 것이 중요합니다.

  • 관리자 권한으로 실행하세요: 시스템 관련 작업을 하는 스크립트는 '관리자 권한으로 실행'해야 정상적으로 동작합니다.

  • 주석을 생활화하세요: 복잡한 스크립트를 작성할 때는 #을 사용해 코드에 대한 설명을 꼼꼼히 남기는 습관을 들이세요. 나중에 코드를 수정하거나 다른 사람과 공유할 때 큰 도움이 됩니다.

  • 최신 PowerShell을 사용하세요: 현재 PowerShell 7은 윈도우 환경뿐만 아니라 크로스 플랫폼 환경에서도 강력한 성능과 새로운 기능들을 제공합니다.

결론: PowerShell, 단순한 도구를 넘어선 강력한 파트너

PowerShell은 윈도우 시스템을 깊이 이해하고, 나아가 시스템 관리와 자동화의 효율을 극대화하는 데 필수적인 도구입니다. 이 글에서 알려드린 기본 개념과 실용적인 예시들을 통해 여러분도 PowerShell 스크립팅의 세계에 첫발을 내디뎌 보시기 바랍니다. 마우스 클릭에 의존하던 수동적인 작업 방식에서 벗어나, 코드를 통해 시스템을 완벽하게 제어하는 진정한 PC 전문가로 거듭날 수 있을 것입니다.

FAQ (자주 묻는 질문)

Q1. PowerShell과 명령 프롬프트(CMD)의 차이점은 무엇인가요? A1. 가장 큰 차이점은 PowerShell은 객체 기반으로 데이터를 처리하고, CMD는 텍스트 기반으로 처리한다는 점입니다. PowerShell은 훨씬 강력한 스크립팅과 자동화 기능을 제공합니다.

Q2. PowerShell은 배우기 어려운가요? A2. 초보자에게는 낯설 수 있지만, 기본적인 명령어(Cmdlet)들은 직관적이며, 이 글의 예시들을 따라 해보면서 실력을 키울 수 있습니다.

Q3. PowerShell 스크립트를 실행했는데 "스크립트를 실행할 수 없습니다"라는 오류가 발생해요. A3. 이는 스크립트 실행 정책이 기본값으로 설정되어 있기 때문입니다. 터미널에서 Set-ExecutionPolicy RemoteSigned 명령어를 실행하여 정책을 변경해야 합니다.

Q4. PowerShell 스크립트가 PC에 해를 끼칠 수도 있나요? A4. 네, 악성 스크립트는 PC에 해를 끼칠 수 있습니다. 따라서 출처를 알 수 없는 스크립트는 실행하지 않는 것이 중요합니다.

Q5. 스크립트가 관리자 권한을 필요로 하는지 어떻게 아나요? A5. 시스템의 중요한 부분을 수정하는 스크립트(예: 서비스 제어, 레지스트리 수정)는 대부분 관리자 권한이 필요합니다. 스크립트를 실행하기 전에 터미널을 '관리자 권한으로 실행'하는 습관을 들이는 것이 좋습니다.

Q6. PowerShell은 무료인가요? A6. 네, PowerShell은 윈도우 운영체제에 기본으로 포함되어 있으며, 최신 버전인 PowerShell 7도 무료로 다운로드하여 사용할 수 있습니다.

Q7. 작성한 스크립트를 실행할 때마다 실행 정책을 바꿔야 하나요? A7. 아닙니다. Set-ExecutionPolicy는 한 번만 설정해 주면 PC의 정책이 영구적으로 변경됩니다.

Q8. PowerShell 7은 윈도우 10에서도 사용할 수 있나요? A8. 네, PowerShell 7은 윈도우 10, 윈도우 11, 맥OS, 리눅스 등 다양한 운영체제에서 사용할 수 있도록 설계되었습니다.

Q9. 파이프라인(|)이 정확히 어떤 역할을 하는 건가요? A9. 파이프라인은 앞 명령어의 실행 결과를 다음 명령어의 입력값으로 전달하는 통로 역할을 합니다. 이를 통해 여러 명령어를 연쇄적으로 실행하여 복잡한 작업을 간단하게 처리할 수 있습니다.

Q10. 초보자가 PowerShell을 배우려면 어디서부터 시작해야 하나요? A10. 이 글의 예시들을 직접 따라 해보고, Get-Help, Get-Command와 같은 내장 도움말 명령어를 통해 PowerShell에 익숙해지는 것부터 시작하는 것이 좋습니다.

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

윈도우 시스템 파일 손상: SFC /scannow 완벽 가이드 (DISM 명령어까지 총정리)

컴퓨터를 사용하다 보면 갑자기 시스템이 느려지거나, 특정 프로그램이 오류를 뿜어내며 종료되는 경험을 하실 수 있습니다. 심지어 윈도우 부팅이 제대로 되지 않는 심각한 문제에 직면하기도 합니다. 이러한 문제의 원인 중 상당수는 '윈도우 시스템 파...