운영 체제의 핵심 기능에 직접적으로 접근하고 싶은 경우 명령 줄 도구를 사용해야 할 수 있습니다. 사용자는 직접적으로 운영 체제와 상호작용하면서 더 정확하고 세밀한 제어를 할 수 있습니다. Windows에는 이런 작업을 돕는 다양한 명령줄 도구들이 있으며 다음의 두가지 도구가 대표적입니다.
- 명령 프롬프트라고 불리는 Command Prompt (cmd.exe)로 Windows에서 가장 손쉽게 접근할 수 있으며 상대적으로 익숙한 도구입니다.
- Windows PowerShell은 객체 기반 스크립트 언어와 명령 줄 셸입니다.
이 둘의 차이는 명령 프롬프트는 텍스트 기반의 명령어를 처리하고 PowerShell은 객체 기반의 명령어를 처리하는 것입니다. 전술한대로 dir
, copy
과 같은 전통적인 Dos 명령어를 사용해 익숙지만 기능 확장의 제한이 있어 고급 기능을 활용하기 위해서는 Windows PowerShell를 주로 사용하게 됩니다.
그러나 이 Windows PowerShell도 .NET Framework
기반으로 되어 있기 때문에 Windows 환경에서만 실행되는 한계가 있습니다. 이는 크로스 플랫폼 환경에서 다양한 작업을 원하는 사용자나 개발자들에게는 큰 제약으로 다가올 수 있습니다. 또한, .NET Framework
의 발전 속도와 제한성 때문에 Windows PowerShell의 업데이트와 새로운 기능 추가도 크게 빠르지 않습니다.
이런 배경 속에서 Microsoft는 크로스 플랫폼 지원과 더 많은 확장성을 목표로 PowerShell Core를 소개하였습니다. 현재 PowerShell 7로 발전한 이 제품은 Windows 뿐만 아니라 macOS, Linux에서도 사용 가능하며, 오픈소스로 진행되어 커뮤니티의 참여와 피드백을 받아 지속적으로 발전하고 있습니다.
따라서 필자는 이러한 이유로 Windows PowerShell보다는 PowerShell Core(현 PowerShell 7)를 사용하고 있으며, 이 부분에 대해서 간단하게 정리해 볼까 합니다.
튜토리얼 환경: 윈도우 11, Microsoft Store, Windows PowerShell 과 PowerShell 7
Windows PowerShell 과 PowerShell의 차이
Windows PowerShell과 로 PowerShell로 불리는 PowerShell Core / PowerShell 7의 차이점을 간단하게 비교해보고 진행 합니다.
항목 | Windows PowerShell | PowerShell |
---|---|---|
기반 | .NET Framework | .NET Core 3.1 (PowerShell 7 이후로는 .NET 5 이상) |
플랫폼 지원 | Windows 전용 | Windows, macOS, Linux |
개발 | 클로즈드 소스 | 오픈 소스 |
유지보수 | 제한적인 업데이트 | 지속적인 업데이트 및 기능 추가 |
모듈 지원 | 일부 최신 모듈 미지원 | 최신 .NET Core 모듈 및 라이브러리와의 호환성 향상 |
성능 | 기본 성능 | 일부 작업에서 더 빠른 성능 |
PowerShell 7은 Windows PowerShell 5.1의 대체재로, Microsoft가 지원하는 최신 버전입니다. 이는 .NET Core
를 기반으로 하여 여러 운영 체제(Windows, macOS, Linux)에서 사용할 수 있습니다.
PowerShell 7의 주요 이점은 다음과 같습니다.
- 크로스 플랫폼 지원: 동일한 스크립트를 여러 운영 체제에서 사용할 수 있습니다.
- 성능 개선: 많은 명령이 최적화되어 실행 속도가 향상되었습니다.
- 새로운 기능: 간결한 문법, 에러 핸들링, 새로운 연산자 등 다양한 새로운 기능을 제공합니다.
- 지속적인 지원과 개선: Microsoft는 Windows PowerShell 5.1 대신 PowerShell 7에 집중하여 지속적인 업데이트를 제공하고 있습니다.
따라서 PowerShell을 자주 사용하는 경우 가능하다면 PowerShell 7의 사용을 권장합니다.
PowerShell 설치하기
PowerShell은 Windows PowerShell과 다르게 Windows에 기본적으로 설치되지 않아 추가적으로 설치를 해야 합니다.
Windows
Windows에서는 Microsoft Store와 winget 패키지 관리도구를 이용해서 설치할 수 있습니다.
Microsoft Store
Microsoft Store를 열고 PowerShell
을 찾고 설치하면 바로 사용할 수 있습니다.
winget
winget은 Windows Package Manager의 줄임말로, Windows 10 및 Windows Server 2019 이상에서 사용 가능한 패키지 관리 도구입니다. 사용자는 winget을 사용하여 소프트웨어를 설치, 업데이트, 제거하거나 조회할 수 있으며 PowerShell도 설치할 수 있습니다.
winget install --id=Microsoft.PowerShell -e
Linux
다양한 Linux 배포판에서도 PowerShell을 설치해서 사용할 수 있습니다.
Ubuntu
sudo apt-get install -y powershell
CentOS
sudo yum install -y powershell
Fedora
sudo dnf install -y powershell
Arch Linux
sudo pacman -S powershell
macOS
macOS에서는 Homebrew cask를 이용해서 손쉽게 PowerShell을 설치할 수 있습니다. Homebrew 더 알아보기
brew cask install powershell
Docker
Docker에서 PowerShell 공식 이미지를 제공하고 있습니다. 아래 명령이나 위 pull 명령으로 손쉽게 다운로드할 수 있습니다.
docker run -it mcr.microsoft.com/powershell
Windows PowerShell 과 PowerShell 같이 사용
Windows PowerShell과 PowerShell Core는 독립적인 제품으로, 둘 다 시스템에 설치되어 동시에 사용할 수 있습니다. 각 버전은 독립적인 실행 경로와 환경을 가지기 때문에 문제없이 동시에 활용할 수 있습니다.
실행 경로
Windows PowerShell 과 PowerShell의 기본적인 실행 경로는 다음과 같습니다.
Windows PowerShell 기본 실행 경로
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
PowerShell Core(7.0 버전) 기본 실행 경로
C:\Program Files\PowerShell\7\pwsh.exe
설정 관리, 프로파일 위치
각 버전의 PowerShell은 독립적인 프로파일을 가지고 있습니다. 이 프로파일은 시작 시 자동으로 로드되는 스크립트 파일로 PowerShell 프로파일을 사용하여 매번 로드되는 초기 설정이나 함수를 정의할 수 있습니다.
Windows PowerShell 프로파일:
C:\Users\YourUserName\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PowerShell Core 프로파일:
C:\Users\YourUserName\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
참고: PowerShell 세션을 시작하면 해당 프로파일이 자동으로 로드되며, 프로파일 스크립트 내에 정의된 모든 설정이나 명령이 실행됩니다. 프로파일 파일에 직접 접근하려면, Windows PowerShell 또는 PowerShell에서 notepad.exe $PROFILE
이라고 입력해 각각의 프로파일을 편집할 수 있습니다.
확장 모듈 관리
최근에는 많이 통합되었지만 확장 모듈은 여전히 각 PowerShell 버전마다 별도로 설치해야 할 수 있습니다. 예를 들면, oh-my-posh, PSReadLine, Terminal-Icons 등의 모듈이 있습니다. 이 모듈들을 PowerShell Core에서 사용하려면 별도로 설치해야 합니다.
PowerShell Core와 Windows PowerShell은 독립적인 실행 환경을 가지고 있기 때문에 각각의 설정과 모듈을 별도로 관리해야 합니다. 이로 인해 둘 사이의 호환성 문제를 피할 수 있으며, 각 버전에 맞게 최적화된 환경을 구성할 수 있습니다. PowerShell 확장 모듈 알아보기
PowerShell 기본 사용법
PowerShell을 사용하기 위한 기본 명령어 및 스크립트 작성 방식과 좀 더 효율적으로 활용할 수 있는 팁 등 기본 사용방법을 안내합니다.
기본 명령어 및 스크립트 작성 방법
PowerShell에서 기본 명령어를 실행하고 도움말을 사용하는 방법과 변수, 조건문 및 루프, 스크립트 활용 등에 대한 전반적인 활용 법을 정리합니다.
명령어 실행
PowerShell에서는 다양한 cmdlets
를 사용합니다. 예를 들어, 파일 목록을 가져오려면 Get-ChildItem
사용하면 됩니다. 필자는 PowerShell에서도 ll
을 별칭Alias으로 등록해두고 사용하고 있으며 이 내용은 아래 별칭 섹션에서 따로 다룹니다.
도움말 사용
PowerShell cmdlet에 대한 도움말을 보려면 Get-Help <cmdlet-name>
을 사용합니다. 예를 들어 다음과 같이 입력한 후 실행하면 Get-ChildItem cmdlet에 대한 도움말과 사용법, 관련 예시, 인수 및 옵션에 대한 정보가 출력됩니다. 이를 통해 해당 cmdlet의 기능 및 사용 방법을 파악할 수 있습니다.
❯ Get-Help Get-ChildItem
이름
Get-ChildItem
구문
Get-ChildItem [[-Path] <string[]>] [[-Filter] <string>] [<CommonParameters>]
Get-ChildItem [[-Filter] <string>] [<CommonParameters>]
별칭
gci
ls
dir
설명
Get-Help가 이 컴퓨터에서 이 cmdlet에 대한 도움말 파일을 찾을 수 없습니다. 일부 도움말만 표시합니다.
-- 이 cmdlet을 포함하는 모듈에 대한 도움말 파일을 다운로드하여 설치하려면 Update-Help를 사용하십시오.
-- 이 cmdlet에 대한 도움말 항목을 온라인으로 보려면 "Get-Help Get-ChildItem -Online"을 입력하거나
https://go.microsoft.com/fwlink/?LinkID=113308(으)로 이동하십시오.
변수
$
기호를 사용하여 다음과 같이 변수를 생성하고 할당합니다.
$myVariable = "Hello, World!"
조건문 및 루프
PowerShell은 if,
else
, for
, foreach
, while
과 같은 기본적인 프로그래밍 구조를 지원합니다. 예를 들어 다음 스크립트는 조건문과 여러 반복문을 함께 사용하여, 사용자에게 숫자를 입력받고, 그에 따른 반응과 함께 몇 가지 반복 작업을 수행합니다.
# 사용자로부터 숫자를 입력받습니다.
$number = Read-Host "1에서 10까지의 숫자 중 하나를 입력해주세요"
# 숫자가 5인지 확인합니다.
if ($number -eq 5) {
Write-Host "정답입니다!"
} else {
Write-Host "틀렸습니다. 다시 시도해주세요."
}
# 1부터 5까지의 숫자를 출력하는 for 루프
Write-Host "1부터 5까지의 숫자:"
for ($i = 1; $i -le 5; $i++) {
Write-Host $i
}
# 배열을 사용한 foreach 루프
Write-Host "배열의 요소 출력:"
$colors = "빨강", "주황", "노랑", "초록", "파랑"
foreach ($color in $colors) {
Write-Host $color
}
# while 루프를 사용한 카운트다운
Write-Host "카운트다운:"
$count = 5
while ($count -gt 0) {
Write-Host $count
$count--
}
Write-Host "시작!"
스크립트 작성
.ps1
확장자로 PowerShell 스크립트를 작성할 수 있습니다. 예를 들어 아래 스크립트를 실행하면, 현재 시간을 출력하고 사용자로부터 이름을 입력받아 인사말을 출력합니다.
# 현재 시간 출력
Write-Host "현재 시간은 $(Get-Date) 입니다."
# 사용자로부터 이름 입력 받기
$name = Read-Host "당신의 이름을 입력해주세요"
# 이름과 함께 인사말 출력
Write-Host "안녕하세요, $name 님!"
참고: 스크립트를 실행하기 전에, Set-ExecutionPolicy RemoteSigned
명령을 사용하여 실행 정책을 설정해야 할 수도 있습니다.
효율적인 활용을 위한 팁
Windows PowerShell과 PowerShell을 보다 효율적으로 사용하기 위한 간단한 팁들입니다.
탭 완성
cmdlet
입력 중 탭 키를 사용하여 명령어를 자동 완성할 수 있습니다. 탭 완성은 PowerShell에서 명령어나 파일 경로 등을 빠르게 입력할 때 사용하는 기능입니다. 이 기능을 사용하면 입력 중에 탭 키를 누르면 시스템이 가능한 명령어나 경로를 자동으로 완성해줍니다. 이로써 명령어를 빠르게 입력하고 오타를 줄일 수 있습니다. 예를 들어, 다음과 같은 상황에서 탭 완성을 사용할 수 있습니다.
- 명령어 자동 완성: PowerShell에서 명령어를 입력하는 중에 탭 키를 누르면 시스템은 현재 입력 중인 명령어와 관련된 가능한 명령어를 나열합니다. 이때 여러 명령어가 가능한 경우에는 해당 명령어의 첫 글자까지 입력한 후 탭을 누르면 명령어가 자동으로 완성됩니다. 명령어 입력 중에
Get-Pr
까지 입력하고 탭을 누르면Get-Process
로 자동 완성됩니다. - 파일 경로 자동 완성: 파일이나 폴더의 경로를 입력할 때도 탭 완성을 사용할 수 있습니다. 경로 입력 중에 탭 키를 누르면 시스템은 해당 경로와 관련된 파일이나 폴더를 나열하여 선택할 수 있게 해줍니다.
C:\Users\
라는 경로를 입력 중에 탭을 누르면 해당 디렉터리 내의 파일 및 폴더 목록이 표시됩니다.
히스토리
Get-History
를 사용하여 이전에 실행한 명령어 목록을 확인할 수 있습니다. Invoke-History
를 사용하여 이전 명령어를 다시 실행할 수도 있으며 Get-History 결과는 보통 아래와 같습니다.
Id CommandLine
-- -------
1 Get-Process
2 Get-Service
3 Get-ChildItem
4 Set-Location C:\Users
5 Clear-Host
이제 위 내용을 참고해 Invoke-History
를 사용하여 이전 명령어 다시 실행할 수 있습니다. 3
은 이전 명령어의 ID이며, 해당 명령어가 다시 실행됩니다.
PS C:\Users\UserName> Invoke-History 3
별칭(alias)
자주 사용하는 cmdlet
에 대한 짧은 이름을 지정할 수 있습니다. 예를 들어, Get-ChildItem
에 대한 별칭은 gci
입니다. PowerShell에서 별칭을 등록하는 것은 임시 별칭 생성, 프로파일에 별칭을 추가하는 방식이 있고, 이용 방식은 다음 두 가지로 나누어 볼 수 있으며 두 방식 중 원하는 동작을 선택하여 사용하면 됩니다.
Set-Alias를 이용한 방식
이 방식은 특정 cmdlet
이나 함수에 직접적인 별칭을 생성합니다. 단순히 cmdlet
이나 함수의 이름을 변경하여 사용하는 방식입니다. 따라서 별칭을 통해 cmdlets
호출하면 원래 cmdlet
의 기능만 수행됩니다.
Set-Alias -Name ll -Value Get-ChildItem
함수를 이용한 방식
이 방식은 주로 cmdlet
의 동작을 커스텀화하여 새로운 이름의 함수로 정의하고 사용하는 방식입니다. 함수를 사용하는 방식에서는 원래의 cmdlet
기능을 확장하거나 변경하여 사용할 수 있습니다. 예를 들면, ll
함수는 Get-ChildItem
의 기능에 -Force
옵션을 추가하여 숨겨진 아이템까지 출력하는 기능을 가지게 됩니다.
필자는 주로 함수를 이용한 방식을 사용하며 실제 등록해둔 별칭을 몇가지 안내합니다.
function virc { vi $PROFILE }
function noterc { notepad $PROFILE }
function vimrc { vi $HOME\_vimrc }
function ll { Get-ChildItem -Force }
function chocoup { choco upgrade all -y }
function chocoll { choco list --by-id-only }
function wingetup { winget upgrade --all }
function wingetll { winget list }
function vi { vim $args }
function cc { clear }
function cdroot { Set-Location "C:\Users\$env:UserName\" }
function cddoc { Set-Location "C:\Users\$env:UserName\Documents" }
function Remove-Force { param($target) Remove-Item $target -Force }
Set-Alias -Name rm -Value Remove-Force -Option AllScope -Force
파이프라인 사용
Enter키 위에 있는 파이프라인 |
기호를 사용하여 한 cmdlet
의 출력을 다른 cmdlet
의 입력으로 전달할 수 있습니다.
Get-ChildItem | Where-Object {$_.Extension -eq ".txt"}
참고: 이외에도 PowerShell Gallery와 같은 곳에서 커뮤니티가 만든 유용한 모듈을 찾아 활용하면 작업 효율을 크게 향상시킬 수 있습니다.
마치며
이번 글에서는 Windows PowerShell, PowerShell 의 차이와 PowerShell을 설치하고 사용 및 활용하는 방법들에 대해 폭넓게 알아보았습니다. PowerShell 7은 Windows PowerShell과 높은 수준의 호환성을 가지고 있습니다. 대부분의 Windows PowerShell 스크립트는 PowerShell 7에서 문제 없이 실행됩니다. 그러나 일부 구현의 변경으로 인해 작동하지 않을 수 있는 스크립트도 있습니다. 그러나 이러한 호환성 문제를 해결하기 위해 지속적으로 개선이 이루어지고 있습니다.
PowerShell 7은 계속 발전하고 있는 도구로, 이전 버전과의 호환성 뿐만 아니라 새로운 기능과 향상된 성능을 제공합니다. 이는 관리자와 개발자 모두에게 편리한 스크립팅 및 자동화 도구가 되어줍니다. 시스템 관리에 필요한 강력한 기능을 탐색하고 싶다면 PowerShell 7을 사용해 보시길 권장합니다. 여러 플랫폼에서도 동일한 스크립트를 실행할 수 있는 크로스 플랫폼 기능은 특히 주목할 만한 장점입니다. 최신 버전의 PowerShell을 다운로드해 보다 안정적이고 강화된 기능을 체험해 보시길 바랍니다.