2010년에 이 블로그에 PowerShell 입문 연재를 썼다. 그때의 PowerShell은 버전 2.0이었고 Windows에서만 돌았다. 지금은 리눅스와 macOS에서도 도는 오픈소스가 됐고, 그때 손으로 짜야 했던 것들이 언어와 기본 명령 안으로 들어왔다. 옛 글은 내리고, 같은 주제를 PowerShell 7.6 기준으로 다시 쓴다.
예제는 PowerShell 7.6.6에서 실행해 확인했다. 대부분은 리눅스에서, Windows에서만 되는 것(실행 정책, 별칭, 네트워크 어댑터)은 Windows 11에서 돌렸다. WinRM 설정처럼 관리자 권한으로 시스템을 바꾸는 명령은 실행해 보지 않았다.
목차
- PowerShell 7 시작하기 (이 글)
- 스크립트와 실행 정책
- 명령의 종류와 모듈
- 개체와 파이프라인
- 연산자
- 정규 표현식
- 배열과 해시 테이블
- 함수와 매개변수
- 원격 접속
- 네트워크와 웹
- 콘솔 다루기
PowerShell이 둘이다
Windows에는 이름이 비슷한 것이 둘 있다.
| Windows PowerShell 5.1 | PowerShell 7 | |
|---|---|---|
| 실행 파일 | powershell.exe | pwsh |
| 기반 | .NET Framework | .NET (7.6은 .NET 10) |
| 운영체제 | Windows만 | Windows, 리눅스, macOS |
| 배포 | Windows에 들어 있음 | 따로 설치 |
| 상태 | 보안 수정만. 새 기능 없음 | 계속 개발됨 |
둘은 나란히 설치되고 서로 건드리지 않는다. 5.1은 Windows의 일부라 없앨 수 없고, 없앨 필요도 없다. 새로 배우거나 새 스크립트를 쓴다면 7을 쓴다. 이 연재도 7만 다룬다.
7.6은 2026년 3월에 나온 장기 지원(LTS) 버전이고 2028년 11월까지 지원된다.
설치
Windows에서는 winget이 가장 간단하다.
winget install --id Microsoft.PowerShell --source winget
리눅스는 배포판의 패키지 저장소에 Microsoft 저장소를 더해 설치하거나, GitHub 릴리스의 압축 파일을 풀어 그 안의 pwsh를 실행하면 된다. 압축 파일 방식은 설치 없이 폴더 하나로 끝나서 시험해 보기에 좋다. macOS를 포함한 운영체제별 절차는 공식 설치 문서에 있다.
설치했으면 pwsh로 실행하고 버전을 확인한다.
$PSVersionTable
Name Value
---- -----
PSVersion 7.6.6
PSEdition Core
OS Debian GNU/Linux 13 (trixie)
Platform Unix
PSEdition이 Core면 7이고 Desktop이면 5.1이다. 스크립트가 어느 쪽에서 도는지 확인할 때 이 값을 본다.
모르는 것은 PowerShell에게 묻는다
PowerShell을 배울 때 외울 명령은 셋이면 된다. 나머지는 이 셋으로 찾는다.
Get-Command 는 명령을 찾는다. 이름은 동사-명사 꼴이라 짐작으로 찾을 수 있다.
Get-Command -Verb Get -Noun *Item*
Get-ChildItem
Get-Item
Get-ItemProperty
Get-ItemPropertyValue
Get-Help 는 쓰는 법을 보여 준다. -Examples를 붙이면 예제만, -Online을 붙이면 브라우저로 최신 문서를 연다.
Get-Help Get-ChildItem -Examples
Get-Help Get-ChildItem -Online
도움말 본문은 기본으로 들어 있지 않다. 처음 한 번 Update-Help로 받아 두거나 -Online을 쓴다.
Get-Member 는 결과에 무엇이 들어 있는지 보여 준다. PowerShell의 명령은 글자가 아니라 개체를 돌려주기 때문에, 그 개체에 어떤 속성과 메서드가 있는지 알면 다음에 할 일이 보인다. 4편에서 자세히 다룬다.
Get-ChildItem | Get-Member
2010년과 달라진 것
옛 연재를 읽은 사람을 위해, 다시 쓰면서 바뀐 것을 먼저 적어 둔다.
- 어디서나 돈다. 같은 스크립트가 Windows, 리눅스, macOS에서 돈다. 대신
ls,cat,curl같은 별칭은 리눅스와 macOS에서 없다. 그 이름은 운영체제의 진짜 명령이 가져간다. - 병렬 실행이 기본 명령이다.
ForEach-Object -Parallel로 여러 대상을 동시에 처리한다. - 언어가 편해졌다. 삼항 연산자(
? :), null 병합(??), 파이프라인 연결(&&,||)이 생겼다. - 웹은
Invoke-RestMethod한 줄이다.System.Net.WebRequest를 직접 다루던 코드는 필요 없다. - 모듈 설치가 명령 하나다.
Install-PSResource. - 원격 접속에 SSH를 쓸 수 있다. WinRM이 없는 리눅스에도 같은 명령으로 들어간다.
다음 글: 스크립트와 실행 정책