반응형

언제부턴가 윈도우즈에서 Powershell 을 제공하고 있다는 것을 알고는 있었으나.. 쓸일이 별로 없을 거라 생각해서 눈여겨 보고 있지 않았었는데.. 요즘 윈도우즈로 작업을 많이 하다보니 의외로 유용한 기능이 많아서 몇가지 주요 커맨드를 정리해 봅니다.

 

PowerShell 에 대한 자세한 설명은 Microsoft 사이트에서 제공해 주고 있습니다. 한글 번역도 제공해 주고 있는데, 일부는 기계 번역이 되어 있다고 하네요.. 7.2 LTS 버전에 대한 링크 입니다.

 

영문 링크     한글 링크 

 

 

PowerShell 이란?

PowerShell은 윈도우즈 뿐만 아니라 리눅스, 맥OS 등의 OS에서 사용이 가능한 크로스 플랫폼 지원의 작업 자동화 솔루션입니다. 

 

 

PowerShell 설치

Windows 에서는 Windows 10 이후에는 기본으로 설치되어 있는 것 같고, 그 외에는 winget 등을 이용해서 설치하면 된다고 합니다. (홈페이지에는 모던 Windows 10 이라고 되어 있어서 정확한 버전은 모르겠습니다.) 링크 참조 

 

리눅스는 Ubuntu 기준으로 아래 명령어들을 이용하면 설치가 가능하다고 합니다.  링크 참조 

# Update the list of packages
sudo apt-get update
# Install pre-requisite packages.
sudo apt-get install -y wget apt-transport-https software-properties-common
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
# Update the list of packages after we added packages.microsoft.com
sudo apt-get update
# Install PowerShell
sudo apt-get install -y powershell
# Start PowerShell
pwsh

 

맥OS 에서는 홈브루 설치 이후에 cask 를 이용해서 설치하면 됩니다. 링크 참조 

brew install --cask powershell

 

 

주요 명령어

주요 명령어는 제가 많이 사용하는 것들로 정리해 봤습니다.

PowerShell Linux Others 기능 설명
Get-Item ls dir 파일 / 폴더 등의 리스트를 화면에 출력해 줍니다.
참고로 ls 명령어도 사용이 가능한데, 옵션들이 제대로 동작하지 않는 것으로 보아 실제로는 Get-Item이 호출되는 것으로 보입니다.
Get-Content cat   파일의 내용을 보여줍니다. 
참고로 cat 명령어도 사용이 가능한데, cat은 cmdlet Get-Content 라고 명시적으로 나와서 Get-Content 가 호출된다는 것을 알 수 있습니다.
ssh ssh ssh 언제부턴가 ssh 명령어가 되네요.. Secure Shell 을 의미하며, 원격 시스템에 접속해서 명령을 실행하기 위해서 사용합니다.
scp scp scp scp 는 원격 시스템으로 파일을 전송할 때 사용합니다.
Invoke-WebRequest wget, curl   웹 프로토콜 (http, https 등) 을 이용해서 서버의 파일을 가져옵니다.
참고로 wget 이나 curl 을 그냥 써도 Invoke-WebRequest 이 호출됩니다.
Get-Process ps tasklist 프로세스 리스트를 보여줍니다. ps 명령어를 입력해도 Get-Process가 호출되는 것 같습니다. 
Stop-Process kill taskkill 프로세스를 종료합니다. kill 명령어를 입력해도 Stop-Process가 호출 되는 것 같습니다.

 

이 외에도 많은 명령어들이 있으니 필요한 명령어는 아래 링크를 참조하세요.

 

영문 링크     한글 링크 

 

 

활용법

1. 프로세스 검색

먼저 프로세스를 검색해 보겠습니다. 메모장(notepad)를 하나 열고 아래 명령어를 입력합니다. 

Get-Process -Name Notepad

 

아래와 비슷한 결과가 출력될 것입니다.

 

이름으로 프로세스를 검색하는 경우에는, -Name은 생략이 가능합니다.

 

 

만약 프로세스 아이디를 알고 있다면 아래처럼 입력하면 됩니다. (여기서는 아이디가 4556)

Get-Process -Id 4556

 

정확한 프로세스 이름을 모른다면 와일드카드(*)를 이용할 수 있습니다.

Get-Process -Name Note*

 

위의 출력결과에서 Id만 화면에 출력하고 싶다면, 아래와 같이 입력합니다.

Get-Process -Name Notepad | Select-Object Id

여기서 | (pipe) 는 바로 앞의 커맨드의 결과를 받아서 처리하라는 의미이고,  Select-Object는 프로세스 리스트에서 Id 만 선택해서 보여주라는 의미 입니다.

 

결과는 아래처럼 출력됩니다.

 

결과를 리스트로 받기 위해서는 아래와 같이 ExpandProperty 옵션을 추가합니다.

Get-Process -Name Notepad | Select-Object -ExpandProperty Id

 

 

파이프 기능을 활용하면 이전 결과를 필터 할 수도 있습니다. 아래 명령어는 Where-Object 기능을 이용해서 전체 프로세스 리스트 중에 ProcessName이 Notepad 인 것만 필터해서 출력해 줍니다. 즉, 앞에서 입력했던 Get-Process Notepad 와 같은 결과가 나옵니다. 여기서 $_ 는 이전 결과 리스트의 아이템(원소)를 의미합니다.

Get-Process | Where-Object {$_.ProcessName -eq 'Notepad'}

 

 

2. 프로세스 종료

이번에는 프로세스를 강제로 종료하는 명령어입니다. 이전에 실행했던 메모장을 종료하기 위해서는 아래와 같이 입력합니다.

Stop-Process -Name Notepad -Force

Stop-Process의 경우 Get-Process 처럼 와일드 카드로 프로세스를 종료하는 것은 가능하지만, -Name은 생략할 수 없습니다. 참고로 뒤에 붙인 -Force는 다른 사용자가 실행한 프로세스라도 강제로 종료시키라는 의미 입니다.

 

또한, 프로세스 아이디로도 종료가 가능합니다.

Stop-Process -Id 4556 -Force

 

 

3. 리스트

다음은 리스트를 처리하는 명령어들입니다.

 

프로세스 리스트를 ProcessName으로 정렬해서 10개만 보여주는 명령어 입니다.

Get-Process | Sort-Object -Property ProcessName | Select-Object -Skip 0 -First 10

오름차순으로 정렬이 되는데, 내림차순으로 정렬하고 싶다면 -Descending 옵션을 추가하면 됩니다.

 

아래처럼 입력하면 ProcessName을 역순으로 정렬해서, index 0과 index 1에 해당하는 아이템을 화면에 출력해 줍니다.

Get-Process | Sort-Object -Property ProcessName -Descending | Select-Object -Index 0, 1

 

Powershell에서는 아래처럼 입력하면 리스트로 인식합니다.

1,2,3,4,5,6,7,8,9

 

그래서 파이프를 걸어서 5보다 큰 값을 출력하게 할 수 있습니다.

1,2,3,4,5,6,7,8,9 | Where-Object {$_ -gt 5}

 

순차적인 숫자의 리스트는 다음과 같이 생성할 수도 있습니다.

1..9

 

아래 명령어는 리스트에서 중복되지 않는 값만 출력해 줍니다.

1,2,3,1,2,3,1,2,3,4 | Select-Object -Unique

 

아래 명령어는 1 ~ 9 까지의 리스트를 생성해서 마지막 값을 출력해 줍니다.

1..9 | Select-Object -Last 1

 

 

4. ForEach-Object

리스트를 핸들하는 예시입니다.

 

먼저 map 의 예시입니다. map은 리스트를 받아서 리스트를 돌려줍니다. 아래 예시는 [1, 2, 3, 4, 5, 6, 7, 8, 9] 리스트를 생성해서 각 원소에 2를 곱한 결과를 다시 리스트로 반환합니다. 결과는 [2, 4, 6, 8, 10, 12, 14, 16, 18] 이 됩니다.

1..9 | ForEach-Object -Process {$_ * 2}

위의 예시에서 -Process 는 생략가능하며, ForEach-Object 대신 %{$_ * 2} 을 사용해도 같은 결과가 리턴됩니다.

 

이번에는 reduce 예시입니다. reduce는 리스트를 받아서 연산한 결과값을 돌려줍니다. 아래 예시는 [1, 2, 3, 4, 5, 6, 7, 8, 9] 리스트를 생성해서 원소들의 합을 구해서 돌려줍니다. 결과는 45 가 됩니다.

1..9 | ForEach-Object -Begin {$sum = 0} -Process {$sum += $_} -End {$sum}

ForEach-Object 대신 ForEach 라고 써도 되는 것 같습니다. 그리고 Process는 여러 개를 지정하여 순차적으로 수행하게 할 수 있습니다.

1..2 | ForEach-Object -Begin $null -Process {'Process A'}, {'Process B'} -End $null

 

Begin, End 스크립트 등에는 세미콜론(;)을 이용해서 여러 변수를 지정할 수 있습니다. Process에서도, 여러 개의 스크립트를 지정하지 않고, 세미콜론(;)으로 구분된 여러 문장을 실행하는 것도 가능합니다.

1..9 | ForEach-Object -Begin {$a = 0; $b = 1} -Process {$a += $_; $b *= $_} -End {$a; $b}

End는 {$a, $b} 로 표기해도 같은 결과가 나오며, 리스트 형태로 반환됩니다.

 

 

ForEach는 아래와 같이 사용도 가능합니다. (이렇게 호출하면 내부적으로 ForEach-Object 를 호출하지 않는 것 같습니다.)

ForEach ($_ in 1..9) {$_}

결과는 리스트 형태로 [1, 2, 3, 4, 5, 6, 7, 8, 9] 를 반환합니다.

 

파이프와 같이 사용할 때는 아래처럼 사용이 가능합니다.

1..9 | %{$_ * 2}

 

 

5. CSV

다음은 CSV 파일의 내용을 볼 수 있는 명령어 입니다.

 

첨부된 샘플 csv를 이용해서 테스트 했습니다.

 

sample.csv
0.00MB

 

Import-CSV sample.csv

 

아래와 같은 결과가 나올 것입니다.

 

만약 여기서 Last name 만 출력하고 싶다면, 아래처럼 입력하면 됩니다.

Import-CSV sample.csv | Select-Object "Last name"

 

여기서 Identifier가 5000이하인 사람만 출력하고 싶으면, 아래처럼 입력하면 됩니다.

Import-CSV sample.csv | Where-Object {$_.Identifier -le 5000}

 

아래처럼 필터링 되어서 필요한 결과만 나오게 됩니다.

 

 

이 포스트에서 소개한 명령어 이외에도 많은 기능들이 있으니 매뉴얼을 참고하시기 바랍니다.

 

 

ps. 참고로 Windows PowerShell은 대소문자 구분을 하지 않습니다. 다른 OS에서는 확인해 보지 않았지만.. OS 특성상 다른 OS에서는 대소문자 구분을 할 것 같네요..

 

반응형

+ Recent posts