목차
윈도우에서 검은색 또는 파란색 명령창을 마주치면 왠지 모르게 긴장될 때가 있습니다.
마우스로 클릭하면 될 일을 굳이 키보드로 입력해야 할 것 같고, 명령어 한 줄을 잘못 입력하면 컴퓨터가 연기와 함께 사라질 것 같은 묘한 분위기도 풍깁니다.
하지만 PowerShell을 제대로 이해하면 이야기가 달라집니다.
반복해서 클릭하던 작업을 명령어 한 줄로 끝내고, 여러 대의 서버 상태를 동시에 확인하고, 수백 개의 파일을 규칙에 따라 정리할 수 있습니다.
한마디로 PowerShell은 단순한 명령 프롬프트가 아니라 Windows를 자동으로 움직이는 조종석입니다.
1. PowerShell이란 무엇인가?
PowerShell은 Microsoft가 개발한 명령줄 셸이자 스크립트 언어입니다.
명령어를 직접 실행할 수 있을 뿐만 아니라 변수, 조건문, 반복문, 함수 등을 사용하여 프로그램처럼 자동화 스크립트를 작성할 수 있습니다.
PowerShell은 Windows뿐 아니라 Linux와 macOS에서도 실행할 수 있으며, 명령 결과를 단순 문자열이 아닌 .NET 객체로 처리한다는 특징을 가지고 있습니다.
PowerShell로 할 수 있는 대표적인 작업은 다음과 같습니다.
- 파일과 폴더 생성, 복사, 이동, 삭제
- 실행 중인 프로그램과 프로세스 확인
- Windows 서비스 시작 및 중지
- 네트워크 연결 상태 확인
- 이벤트 로그 분석
- 사용자와 시스템 정보 조회
- CSV, JSON 데이터 처리
- REST API 호출
- 원격 서버 관리
- 반복 업무 자동화
- 개발 환경 및 배포 스크립트 작성
파일 500개의 이름을 하나씩 변경해야 한다고 가정해 보겠습니다.
마우스로 처리하면 손가락과 정신력이 함께 퇴근하지만, PowerShell에서는 몇 줄의 명령어로 해결할 수 있습니다.
2. CMD와 PowerShell은 무엇이 다를까?
Windows에는 오래전부터 명령 프롬프트인 CMD가 존재했습니다.
CMD에서도 `dir`, `copy`, `move`, `ping` 같은 명령어를 사용할 수 있습니다. 하지만 복잡한 자동화와 데이터 처리에는 한계가 있습니다.
CMD의 특징
CMD는 비교적 단순한 명령 실행과 배치 파일 작성에 적합합니다.
- 오래된 Windows 환경과 높은 호환성
- 간단한 명령어 실행
- 배치 파일 `.bat`, `.cmd` 작성
- 명령 결과를 주로 문자열로 처리
PowerShell의 특징
PowerShell은 시스템 관리와 자동화를 목표로 설계되었습니다.
- 명령 결과를 객체로 처리
- 변수, 배열, 조건문, 반복문, 함수 지원
- CSV와 JSON 데이터 처리
- Windows 서비스 및 이벤트 로그 관리
- REST API 호출
- 원격 서버 관리
- 모듈을 이용한 기능 확장
CMD가 공구함 속 드라이버 한 자루라면, PowerShell은 공구함과 부품 창고, 작업 지시서까지 함께 들어 있는 자동화 작업실에 가깝습니다.
3. Windows PowerShell 5.1과 PowerShell 7의 차이
PowerShell을 검색하다 보면 다음 두 이름을 만나게 됩니다.
- Windows PowerShell
- PowerShell
이 둘은 비슷해 보이지만 버전과 실행 환경이 다릅니다.
Windows PowerShell 5.1
Windows PowerShell은 Windows에 기본 포함된 기존 버전입니다.
실행 파일 이름은 다음과 같습니다.
powershell.exeWindows PowerShell의 최종 버전은 5.1이며, Microsoft는 Windows PowerShell에 새로운 기능을 추가하지 않고 있습니다.
Windows 전용 관리 모듈이나 오래된 사내 시스템에서는 여전히 Windows PowerShell 5.1이 필요한 경우가 있습니다.
PowerShell 7
PowerShell 7은 현재 개발이 이어지고 있는 최신 PowerShell 계열입니다.
실행 파일 이름은 다음과 같습니다.
pwsh.exePowerShell 7은 Windows, Linux, macOS에서 사용할 수 있으며 성능 개선, 병렬 처리, 최신 언어 기능 등을 제공합니다. 기존 Windows PowerShell 5.1과 나란히 설치하여 사용할 수도 있습니다.
2026년 7월 기준 공식 GitHub 저장소의 최신 릴리스는 PowerShell 7.6.3입니다. 버전은 계속 변경되므로 실제 설치 전 공식 릴리스 페이지에서 확인하는 것이 좋습니다.
어떤 버전을 사용해야 할까?
일반적인 개발과 자동화 작업에는 PowerShell 7을 권장합니다.
다만 Active Directory, 오래된 Windows 관리 모듈, 특정 사내 프로그램과 연동해야 한다면 Windows PowerShell 5.1이 필요할 수 있습니다.
두 버전을 함께 설치해 상황에 따라 선택하는 방법이 가장 현실적입니다.
4. 현재 PowerShell 버전 확인하기
PowerShell을 실행한 뒤 다음 명령어를 입력합니다.
$PSVersionTable버전만 간단하게 확인하려면 다음 명령어를 사용할 수 있습니다.
$PSVersionTable.PSVersion출력 결과에서 `PSEdition`도 확인해 보세요.
$PSVersionTable.PSEdition일반적으로 다음과 같이 표시됩니다.
- `Desktop`: Windows PowerShell 5.1
- `Core`: PowerShell 7 계열
현재 열려 있는 창이 어느 PowerShell인지 헷갈릴 때 사용할 수 있는 작은 탐정 명령어입니다.
5. PowerShell 7 설치하기
Windows 환경에서는 WinGet을 이용하는 방법이 편리합니다.
winget install --id Microsoft.PowerShell --source winget설치가 끝난 후 Windows Terminal을 다시 실행하면 PowerShell 프로필이 자동으로 추가되는 경우가 많습니다. Microsoft 공식 문서에서도 Windows 클라이언트의 PowerShell 설치 방법으로 WinGet을 안내하고 있습니다.
설치된 버전을 확인합니다.
pwsh$PSVersionTable스크립트 작성에는 VS Code와 Microsoft PowerShell 확장 조합이 좋습니다. Microsoft도 PowerShell 스크립트 작성을 위한 권장 편집기로 VS Code와 PowerShell 확장을 안내하고 있습니다.
6. PowerShell 명령어의 기본 문법
PowerShell의 기본 명령어는 대부분 다음 형태로 구성됩니다.
동사-명사예를 들어 다음과 같습니다.
Get-Process
Get-Service
Start-Service
Stop-Process
New-Item
Remove-Item
Copy-Item영어 문장처럼 읽어보면 의미가 자연스럽게 연결됩니다.
- `Get-Process`: 프로세스를 가져온다
- `Stop-Process`: 프로세스를 중지한다
- `New-Item`: 새로운 항목을 만든다
- `Remove-Item`: 항목을 제거한다
처음에는 명령어가 많아 보이지만, 자주 사용하는 동사만 익혀도 상당수 명령을 추측할 수 있습니다.
자주 사용하는 동사
Get 조회
Set 설정
New 생성
Remove 삭제
Start 시작
Stop 중지
Restart 재시작
Test 검사
Import 불러오기
Export 내보내기
ConvertTo 변환하기
ConvertFrom 변환 결과 불러오기PowerShell 명령어는 이름 자체가 설명서 역할을 합니다.
7. 명령어를 찾는 가장 중요한 세 가지 방법
PowerShell 명령어를 전부 외울 필요는 없습니다.
사실 외우려고 덤비면 PowerShell보다 기억력이 먼저 종료될 가능성이 큽니다.
사용 가능한 명령어 검색
Get-Command서비스 관련 명령어만 검색하려면 다음과 같이 입력합니다.
Get-Command *Service*동사가 `Get`인 명령어만 검색할 수도 있습니다.
Get-Command -Verb Get명령어 도움말 확인
Get-Help Get-Process자세한 설명을 확인합니다.
Get-Help Get-Process -Full사용 예제만 확인합니다.
Get-Help Get-Process -ExamplesPowerShell의 도움말은 `Update-Help`로 내려받거나 업데이트할 수 있습니다. `Get-Command`는 실제 명령 정보를 조회하고, `Get-Help`는 문법과 매개변수, 예제를 확인할 때 사용합니다.
관리자 권한 PowerShell에서 다음 명령어를 실행할 수 있습니다.
Update-Help객체 내부 구조 확인
Get-Process | Get-Member`Get-Member`는 파이프라인으로 전달된 객체가 어떤 속성과 기능을 가지고 있는지 보여줍니다.
PowerShell 세계에서 길을 잃었을 때 사용하는 지도와 나침반이 바로 `Get-Command`, `Get-Help`, `Get-Member`입니다.
8. PowerShell의 핵심, 객체와 파이프라인
PowerShell에서 가장 중요한 개념은 파이프라인입니다.
파이프 기호는 다음과 같습니다.
|파이프라인은 앞 명령의 결과를 뒤 명령으로 전달합니다.
Get-Process | Sort-Object CPU -Descending이 명령은 다음 순서로 동작합니다.
- 실행 중인 프로세스를 가져옵니다.
- 결과를 파이프라인으로 전달합니다.
- CPU 사용량을 기준으로 내림차순 정렬합니다.
CPU 사용량이 높은 프로세스 10개만 확인해 보겠습니다.
Get-Process |
Sort-Object CPU -Descending |
Select-Object -First 10 Name, Id, CPUPowerShell 파이프라인은 단순한 화면 문자열이 아니라 객체를 전달합니다. 따라서 이름, CPU, 메모리, 상태 같은 속성을 바로 선택하고 정렬할 수 있습니다.
CMD의 파이프가 글자가 적힌 종이를 넘긴다면, PowerShell의 파이프는 속성과 기능이 들어 있는 정리된 택배 상자를 넘기는 셈입니다.
9. 파일과 폴더 관리 명령어
현재 위치 확인
Get-Location폴더 이동
Set-Location C:\Work다음과 같이 짧게 사용할 수도 있습니다.
cd C:\Work파일과 폴더 목록 조회
Get-ChildItem하위 폴더까지 검색합니다.
Get-ChildItem -Recurse확장자가 `.log`인 파일만 검색합니다.
Get-ChildItem C:\Logs -Filter *.log -Recurse새 폴더 만들기
New-Item -Path C:\Work\Backup -ItemType Directory새 파일 만들기
New-Item -Path C:\Work\test.txt -ItemType File파일 복사
Copy-Item C:\Work\test.txt D:\Backup\파일 이동
Move-Item C:\Work\test.txt D:\Backup\파일 삭제
Remove-Item D:\Backup\test.txt삭제 전에 결과를 미리 확인하려면 `-WhatIf`를 붙입니다.
Remove-Item D:\Backup\test.txt -WhatIf`-WhatIf`는 실제 작업을 수행하지 않고 어떤 작업이 실행될지 보여줍니다.
삭제 명령어 앞에 세워두는 안전요원이라고 생각하면 됩니다.
10. 30일 이상 지난 로그 파일 찾기
오래된 로그 파일을 조회해 보겠습니다.
Get-ChildItem C:\Logs -Filter *.log -Recurse |
Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-30)
}실제로 삭제하기 전에는 반드시 `-WhatIf`를 사용합니다.
Get-ChildItem C:\Logs -Filter *.log -Recurse |
Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-30)
} |
Remove-Item -WhatIf결과가 정확한지 확인한 후 `-WhatIf`를 제거합니다.
Get-ChildItem C:\Logs -Filter *.log -Recurse |
Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-30)
} |
Remove-Item자동화는 빠르지만 실수도 빠릅니다.
PowerShell에게 삭제 명령을 내릴 때는 택배 주소를 확인하듯 경로를 한 번 더 확인해야 합니다.
11. 프로세스 관리
실행 중인 프로세스 확인
Get-Process특정 프로세스를 확인합니다.
Get-Process chrome메모리를 많이 사용하는 프로세스 10개를 조회합니다.
Get-Process |
Sort-Object WorkingSet64 -Descending |
Select-Object -First 10 Name, Id,
@{Name = "MemoryMB"; Expression = {
[math]::Round($_.WorkingSet64 / 1MB, 2)
}}프로세스 종료
Stop-Process -Name notepad프로세스 ID로 종료할 수도 있습니다.
Stop-Process -Id 1234강제 종료는 다음과 같습니다.
Stop-Process -Name notepad -Force프로세스 이름을 잘못 입력하면 엉뚱한 프로그램이 퇴근할 수 있으므로 종료 전 `Get-Process`로 대상을 확인하는 습관이 좋습니다.
12. Windows 서비스 관리
전체 서비스 확인
Get-Service실행 중인 서비스만 확인
Get-Service |
Where-Object Status -eq "Running"특정 서비스 확인
Get-Service -Name w32time서비스 시작
Start-Service -Name w32time서비스 중지
Stop-Service -Name w32time서비스 재시작
Restart-Service -Name w32time서비스 제어는 관리자 권한이 필요한 경우가 많습니다.
모든 작업을 관리자 권한으로 실행하기보다는 필요한 작업에서만 관리자 권한을 사용하는 것이 안전합니다.
13. 시스템 정보 확인하기
컴퓨터 이름 확인
$env:COMPUTERNAME현재 사용자 확인
$env:USERNAME운영체제 정보 확인
Get-CimInstance Win32_OperatingSystem |
Select-Object Caption, Version, OSArchitecture, LastBootUpTimeCPU 정보 확인
Get-CimInstance Win32_Processor |
Select-Object Name, NumberOfCores, NumberOfLogicalProcessors메모리 정보 확인
Get-CimInstance Win32_ComputerSystem |
Select-Object Manufacturer, Model,
@{Name = "MemoryGB"; Expression = {
[math]::Round($_.TotalPhysicalMemory / 1GB, 2)
}}디스크 용량 확인
Get-Volume |
Select-Object DriveLetter, FileSystemLabel,
@{Name = "FreeGB"; Expression = {
[math]::Round($_.SizeRemaining / 1GB, 2)
}},
@{Name = "SizeGB"; Expression = {
[math]::Round($_.Size / 1GB, 2)
}}이 명령들을 조합하면 별도 프로그램 없이도 간단한 PC 점검 보고서를 만들 수 있습니다.
14. 네트워크 상태 확인하기
특정 서버 연결 확인
Test-Connection google.com -Count 4특정 포트 연결 확인
Test-NetConnection google.com -Port 443현재 열려 있는 수신 포트 확인
Get-NetTCPConnection -State Listen |
Sort-Object LocalPortIP 설정 확인
기존 Windows 명령어도 PowerShell에서 그대로 실행할 수 있습니다.
ipconfig /allDNS 캐시를 확인합니다.
Get-DnsClientCacheDNS 캐시를 초기화합니다.
Clear-DnsClientCache웹 서버의 443 포트가 열리지 않거나 API 서버 연결이 실패할 때 `Test-NetConnection`은 꽤 유용한 진단 도구입니다.
Test-NetConnection api.example.com -Port 44315. 이벤트 로그 확인하기
최근 시스템 이벤트 20개를 조회합니다.
Get-WinEvent -LogName System -MaxEvents 20오류 수준의 이벤트만 조회합니다.
Get-WinEvent -FilterHashtable @{
LogName = "System"
Level = 2
} -MaxEvents 50최근 24시간 동안 발생한 시스템 오류를 조회합니다.
$startTime = (Get-Date).AddDays(-1)
Get-WinEvent -FilterHashtable @{
LogName = "System"
Level = 2
StartTime = $startTime
}컴퓨터가 갑자기 종료되거나 서비스가 반복적으로 중단된다면 이벤트 로그가 중요한 단서를 제공할 수 있습니다.
PowerShell은 사건 현장의 CCTV를 빠르게 돌려보는 역할을 합니다.
16. 결과를 CSV 파일로 저장하기
실행 중인 프로세스 목록을 CSV 파일로 저장합니다.
Get-Process |
Select-Object Name, Id, CPU, WorkingSet64 |
Export-Csv C:\Reports\process.csv `
-NoTypeInformation `
-Encoding utf8다시 불러옵니다.
Import-Csv C:\Reports\process.csv서비스 상태도 CSV로 저장할 수 있습니다.
Get-Service |
Select-Object Name, DisplayName, Status |
Export-Csv C:\Reports\services.csv `
-NoTypeInformation `
-Encoding utf8PowerShell 객체는 CSV와 JSON으로 쉽게 변환할 수 있어 점검 결과, 서버 목록, 사용자 목록 등을 자동으로 정리하기 좋습니다.
17. REST API 호출하기
PowerShell에서는 `Invoke-RestMethod`를 사용하여 REST API를 호출할 수 있습니다.
$response = Invoke-RestMethod `
-Uri "https://api.example.com/status" `
-Method Get
$responseJSON 응답은 PowerShell 객체로 자동 변환되므로 속성에 바로 접근할 수 있습니다.
$response.status
$response.messagePOST 요청은 다음과 같이 작성할 수 있습니다.
$body = @{
name = "PowerShell"
status = "Running"
} | ConvertTo-Json
Invoke-RestMethod `
-Uri "https://api.example.com/items" `
-Method Post `
-ContentType "application/json" `
-Body $body`Invoke-RestMethod`는 HTTP 또는 HTTPS 기반 REST 서비스에 요청을 보내고 JSON이나 XML 응답을 구조화된 객체로 변환할 수 있습니다.
개발자라면 PowerShell을 이용해 API 상태 확인, 배포 결과 검사, 테스트 데이터 생성 같은 작업도 자동화할 수 있습니다.
18. 변수 사용하기
PowerShell 변수는 `$` 기호로 시작합니다.
$name = "PowerShell"
$count = 10
$today = Get-Date출력합니다.
$name
$count
$today문자열 안에 변수를 넣을 수 있습니다.
Write-Output "현재 학습 중인 도구는 $name입니다."배열도 간단하게 만들 수 있습니다.
$servers = @(
"SERVER01"
"SERVER02"
"SERVER03"
)배열의 첫 번째 값을 가져옵니다.
$servers[0]19. 조건문 사용하기
$freeSpaceGB = 15
if ($freeSpaceGB -lt 10) {
Write-Warning "디스크 여유 공간이 부족합니다."
}
elseif ($freeSpaceGB -lt 20) {
Write-Output "디스크 공간을 점검해 주세요."
}
else {
Write-Output "디스크 상태가 정상입니다."
}자주 사용하는 비교 연산자는 다음과 같습니다.
-eq 같다
-ne 같지 않다
-gt 크다
-ge 크거나 같다
-lt 작다
-le 작거나 같다
-like 패턴과 일치한다
-match 정규식과 일치한다문자열을 비교할 때도 사용합니다.
$status = "Running"
if ($status -eq "Running") {
Write-Output "서비스가 정상 실행 중입니다."
}20. 반복문 사용하기
foreach 반복문
$servers = @(
"SERVER01"
"SERVER02"
"SERVER03"
)
foreach ($server in $servers) {
Write-Output "$server 상태를 확인합니다."
}파이프라인 반복 처리
Get-Service |
ForEach-Object {
Write-Output "$($_.Name) : $($_.Status)"
}`$_`는 현재 파이프라인에서 처리 중인 객체를 의미합니다.
처음 보면 외계어 같지만, 뜻은 단순합니다.
“지금 컨베이어 벨트 위에 올라온 바로 그 물건”입니다.
21. 함수 만들기
반복해서 사용하는 명령은 함수로 묶을 수 있습니다.
function Get-DiskSummary {
Get-Volume |
Where-Object DriveLetter |
Select-Object DriveLetter,
@{Name = "FreeGB"; Expression = {
[math]::Round($_.SizeRemaining / 1GB, 2)
}},
@{Name = "TotalGB"; Expression = {
[math]::Round($_.Size / 1GB, 2)
}}
}함수를 실행합니다.
Get-DiskSummary매개변수를 받는 함수도 만들 수 있습니다.
function Test-WebPort {
param(
[Parameter(Mandatory)]
[string]$ComputerName,
[int]$Port = 443
)
Test-NetConnection `
-ComputerName $ComputerName `
-Port $Port
}실행 방법은 다음과 같습니다.
Test-WebPort -ComputerName google.comTest-WebPort -ComputerName localhost -Port 808022. PowerShell 스크립트 만들기
PowerShell 스크립트의 확장자는 `.ps1`입니다.
예를 들어 다음 파일을 만듭니다.
SystemCheck.ps1파일 내용은 다음과 같이 작성합니다.
$reportPath = "C:\Reports"
if (!(Test-Path $reportPath)) {
New-Item `
-Path $reportPath `
-ItemType Directory `
-Force | Out-Null
}
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$filePath = Join-Path $reportPath "SystemCheck_$timestamp.txt"
"점검 시간: $(Get-Date)" | Out-File $filePath
"컴퓨터명: $env:COMPUTERNAME" | Out-File $filePath -Append
"사용자명: $env:USERNAME" | Out-File $filePath -Append
Get-CimInstance Win32_OperatingSystem |
Format-List Caption, Version, LastBootUpTime |
Out-File $filePath -Append
Get-Volume |
Format-Table DriveLetter, FileSystemLabel,
SizeRemaining, Size -AutoSize |
Out-File $filePath -Append
Write-Output "시스템 점검 보고서가 생성되었습니다."
Write-Output $filePath실행합니다.
.\SystemCheck.ps1명령어 몇 개가 합쳐지면서 시스템 점검 로봇 한 대가 완성되었습니다.
23. 실행 정책 이해하기
스크립트를 실행할 때 다음과 같은 오류를 만날 수 있습니다.
이 시스템에서 스크립트를 실행할 수 없으므로...현재 실행 정책을 확인합니다.
Get-ExecutionPolicy범위별 정책을 확인합니다.
Get-ExecutionPolicy -List개인 PC에서 신뢰할 수 있는 로컬 스크립트를 실행하려는 경우 현재 사용자 범위에 `RemoteSigned`를 설정할 수 있습니다.
Set-ExecutionPolicy `
-Scope CurrentUser `
-ExecutionPolicy RemoteSigned인터넷에서 내려받은 신뢰할 수 있는 파일만 차단 해제하려면 다음 명령어를 사용할 수 있습니다.
Unblock-File .\SystemCheck.ps1PowerShell 실행 정책은 스크립트 실행 조건을 제어하는 안전 기능이지만 완전한 보안 경계는 아닙니다. 무조건 `Bypass`나 `Unrestricted`로 변경하기보다는 필요한 범위에만 적절한 정책을 적용해야 합니다.
회사 PC에서는 그룹 정책으로 실행 정책이 관리될 수 있으므로 임의 변경 전에 관리자 정책을 확인해야 합니다.
24. 오류 처리하기
자동화 스크립트에서는 오류가 발생했을 때 조용히 넘어가지 않도록 처리해야 합니다.
try {
Get-Content `
-Path "C:\Data\settings.json" `
-ErrorAction Stop
Write-Output "파일을 정상적으로 읽었습니다."
}
catch {
Write-Error "파일 처리 중 오류가 발생했습니다."
Write-Error $_.Exception.Message
}
finally {
Write-Output "작업을 종료합니다."
}PowerShell에는 화면에 오류를 표시하지만 스크립트를 계속 실행하는 비종료 오류가 있습니다.
`try/catch`로 확실하게 처리하려면 필요한 명령에 다음 옵션을 사용하는 것이 좋습니다.
-ErrorAction Stop`-ErrorAction Stop`은 비종료 오류를 중단 가능한 오류로 전환하여 `catch`에서 처리할 수 있게 합니다.
스크립트 전체에서 엄격하게 처리하려면 다음 설정도 고려할 수 있습니다.
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"다만 기존 스크립트에 적용하면 숨겨져 있던 오류가 갑자기 등장할 수 있으므로 충분한 테스트가 필요합니다.
25. PowerShell 프로필 꾸미기
PowerShell 프로필은 PowerShell이 시작될 때 자동으로 실행되는 스크립트입니다.
프로필 경로를 확인합니다.
$PROFILE프로필이 존재하는지 확인합니다.
Test-Path $PROFILE프로필이 없다면 생성합니다.
if (!(Test-Path $PROFILE)) {
New-Item `
-ItemType File `
-Path $PROFILE `
-Force
}메모장으로 엽니다.
notepad $PROFILE프로필에는 자주 사용하는 함수, 변수, 모듈, 프롬프트 설정 등을 넣을 수 있습니다. PowerShell 프로필은 시작 시 실행되는 스크립트이며 사용자와 실행 환경에 따라 여러 프로필을 구성할 수 있습니다.
예를 들어 다음 내용을 넣을 수 있습니다.
Set-PSReadLineOption -PredictionSource History
function ll {
Get-ChildItem @args
}
function cwork {
Set-Location C:\Work
}
function Get-MyIP {
Invoke-RestMethod "https://api.ipify.org"
}프로필을 저장한 후 PowerShell을 다시 실행하거나 다음 명령어로 즉시 적용합니다.
. $PROFILE26. 명령어 자동 완성과 PSReadLine 활용
PowerShell에서는 Tab 키를 이용해 명령어나 경로를 자동 완성할 수 있습니다.
예를 들어 다음과 같이 입력합니다.
Get-Pro이 상태에서 Tab 키를 누르면 가능한 명령어가 순서대로 표시됩니다.
PSReadLine의 Predictive IntelliSense는 이전 명령 기록을 바탕으로 전체 명령을 제안할 수 있습니다.
설정은 다음과 같습니다.
Set-PSReadLineOption -PredictionSource History목록 형태로 보고 싶다면 다음 설정을 사용할 수 있습니다.
Set-PSReadLineOption `
-PredictionViewStyle ListView매번 적용하기 귀찮다면 `$PROFILE`에 추가합니다.
PowerShell과 친해지는 가장 빠른 방법은 명령어를 완벽히 암기하는 것이 아니라 Tab 키와 도움말을 부지런히 부려 먹는 것입니다.
27. 원격 서버 관리하기
PowerShell Remoting을 사용하면 다른 Windows 컴퓨터에서 명령어를 실행할 수 있습니다.
원격 명령 수신을 설정합니다.
Enable-PSRemoting -Force원격 컴퓨터에 접속합니다.
Enter-PSSession -ComputerName SERVER01원격 세션을 종료합니다.
Exit-PSSession여러 서버에서 동시에 명령을 실행할 수도 있습니다.
Invoke-Command `
-ComputerName SERVER01, SERVER02, SERVER03 `
-ScriptBlock {
Get-Service |
Where-Object Status -eq "Stopped"
}PowerShell Remoting은 Windows 환경에서 주로 WinRM과 WS-Management를 사용하며, 대화형 세션이나 여러 컴퓨터를 대상으로 한 원격 명령 실행을 지원합니다.
운영 환경에서는 다음 사항을 함께 검토해야 합니다.
- 방화벽 설정
- 도메인 또는 신뢰 관계
- 사용자 권한
- WinRM 설정
- HTTPS 사용 여부
- 자격 증명 관리
- 최소 권한 적용
- 원격 명령 감사 로그
원격 관리 기능은 강력한 만큼 구성 없이 무작정 활성화해서는 안 됩니다.
28. 실무 자동화 예제, 폴더 백업하기
다음은 특정 폴더를 ZIP 파일로 백업하는 예제입니다.
param(
[string]$SourcePath = "C:\Work",
[string]$BackupPath = "D:\Backup"
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
try {
if (!(Test-Path $SourcePath)) {
throw "원본 폴더가 존재하지 않습니다: $SourcePath"
}
if (!(Test-Path $BackupPath)) {
New-Item `
-Path $BackupPath `
-ItemType Directory `
-Force | Out-Null
}
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$zipFile = Join-Path `
$BackupPath `
"WorkBackup_$timestamp.zip"
Compress-Archive `
-Path "$SourcePath\*" `
-DestinationPath $zipFile `
-CompressionLevel Optimal
Write-Output "백업이 완료되었습니다."
Write-Output "백업 파일: $zipFile"
}
catch {
Write-Error "백업 중 오류가 발생했습니다."
Write-Error $_.Exception.Message
exit 1
}파일 이름을 다음과 같이 저장합니다.
Backup-Work.ps1실행합니다.
.\Backup-Work.ps1경로를 직접 지정할 수도 있습니다.
.\Backup-Work.ps1 `
-SourcePath "C:\Projects" `
-BackupPath "E:\ProjectBackup"이 스크립트를 Windows 작업 스케줄러와 연결하면 정기 백업 자동화로 발전시킬 수 있습니다.
29. PowerShell 사용 시 반드시 알아야 할 보안 팁
관리자 권한을 습관적으로 사용하지 않기
모든 PowerShell 작업에 관리자 권한이 필요한 것은 아닙니다.
파일 조회나 일반적인 데이터 처리 작업은 일반 사용자 권한으로 실행하고, 서비스 제어나 시스템 설정 변경처럼 필요한 경우에만 관리자 권한을 사용합니다.
인터넷 명령어를 그대로 실행하지 않기
인터넷에서 다음과 비슷한 명령을 발견할 수 있습니다.
Invoke-RestMethod "어떤 주소" | Invoke-Expression짧게는 다음처럼 표시될 수도 있습니다.
irm "어떤 주소" | iex이 명령은 인터넷에서 코드를 내려받아 즉시 실행할 수 있습니다.
내용을 확인하지 않고 실행하면 누군가에게 집 열쇠를 주면서 “아마 택배 기사겠지”라고 생각하는 것과 비슷합니다.
반드시 스크립트를 파일로 내려받은 뒤 내용을 검토하고 출처를 확인해야 합니다.
비밀번호와 API 키를 코드에 직접 넣지 않기
다음과 같은 코드는 피해야 합니다.
$password = "MyPassword1234"
$apiKey = "abcdefg123456"스크립트 파일, Git 저장소, 명령 기록에 비밀 정보가 남을 수 있습니다.
자격 증명을 입력받을 때는 다음 방법을 사용할 수 있습니다.
$credential = Get-CredentialAPI 키는 환경 변수, 보안 저장소 또는 조직의 비밀 관리 시스템을 이용하는 것이 좋습니다.
명령 기록에 비밀값 입력하지 않기
PSReadLine은 여러 PowerShell 세션의 명령 기록을 파일로 보관할 수 있습니다. 따라서 비밀번호나 토큰을 명령줄에 직접 입력하면 기록 파일에 남을 가능성이 있습니다.
삭제와 변경 명령에는 WhatIf 사용하기
Remove-Item C:\Logs\*.log -WhatIfStop-Service -Name w32time -WhatIf먼저 실행 결과를 예상한 뒤 실제 명령을 수행하는 것이 좋습니다.
30. 알아두면 작업 속도가 빨라지는 PowerShell 팁
Tip 1. 긴 명령은 파이프 기준으로 줄바꿈하기
Get-Process |
Where-Object CPU -gt 10 |
Sort-Object CPU -Descending |
Select-Object Name, Id, CPU한 줄에 몰아넣는 것보다 훨씬 읽기 쉽습니다. PowerShell 파이프라인은 파이프 기호를 기준으로 줄을 나누어도 연속된 파이프라인으로 실행할 수 있습니다.
Tip 2. 화면 출력과 데이터 출력을 구분하기
`Format-Table`과 `Format-List`는 사람이 화면에서 보기 좋게 만들 때 사용합니다.
Get-Service |
Format-Table Name, StatusCSV로 저장하거나 뒤에서 데이터를 다시 처리할 때는 `Select-Object`를 사용합니다.
Get-Service |
Select-Object Name, Status |
Export-Csv services.csv -NoTypeInformation파이프라인 중간에 `Format-Table`을 넣으면 뒤에서 객체 데이터를 활용하기 어려워질 수 있습니다.
Tip 3. 별칭은 콘솔에서만 가볍게 사용하기
PowerShell에서는 다음과 같은 별칭을 사용할 수 있습니다.
ls
dir
cd
cat하지만 저장하거나 공유하는 스크립트에서는 전체 명령어를 사용하는 것이 좋습니다.
Get-ChildItem
Set-Location
Get-ContentMicrosoft의 스크립트 분석 규칙에서도 별칭은 코드의 가독성과 유지보수성을 떨어뜨릴 수 있으므로 전체 명령어 사용을 권장합니다.
Tip 4. 실행 전 대상 개수를 확인하기
파일을 변경하거나 삭제하기 전 개수를 먼저 확인합니다.
$targets = Get-ChildItem C:\Logs -Filter *.log
$targets.Count
$targets확인 후 작업합니다.
$targets | Remove-Item -WhatIfTip 5. 작업 로그 남기기
PowerShell 작업 내용을 기록하려면 다음 명령어를 사용할 수 있습니다.
Start-Transcript `
-Path "C:\Logs\PowerShell_$(Get-Date -Format yyyyMMdd_HHmmss).log"작업이 끝나면 기록을 종료합니다.
Stop-Transcript자동화 스크립트에서 문제가 발생했을 때 로그는 범인을 찾는 손전등 역할을 합니다.
31. 마무리
PowerShell은 단순히 검은 화면에 명령어를 입력하는 도구가 아닙니다.
Windows 시스템 관리, 파일 처리, 네트워크 점검, 서버 운영, API 연동, 개발 환경 구성, 반복 업무 자동화까지 연결할 수 있는 강력한 플랫폼입니다.
처음부터 거대한 자동화 스크립트를 만들 필요는 없습니다.
다음 순서로 천천히 시작하면 됩니다.
명령어 하나 실행하기
→ 파이프라인으로 연결하기
→ 결과를 필터링하기
→ 변수에 저장하기
→ 조건문과 반복문 넣기
→ 함수로 만들기
→ ps1 스크립트로 저장하기
→ 작업 스케줄러와 연결하기오늘 반복해서 클릭한 작업이 있다면 PowerShell로 바꿀 수 있는지 한번 살펴보세요.
클릭 열 번이 명령어 한 줄로 줄어드는 순간, PowerShell은 더 이상 어려운 검은 창이 아니라 시간을 돌려주는 자동화 장치가 됩니다.
#WindowsPowerShell #PowerShell #파워쉘 #윈도우명령어 #PowerShell명령어 #PowerShell스크립트 #업무자동화 #윈도우자동화 #시스템관리 #서버관리 #개발자도구 #윈도우팁 #IT블로그 #프로그래밍 #DevOps
