[Windows] 파워셸 스크립팅: 자주 사용하는 명령어(cmdlet)

참고 문서

개요

악의축에서 갓갓으로 거듭나고 있는 마소의 파워셸 명령어 정리 글.

파워셸 명령어는 Cmdlet이라 부른다. 'command-let'으로 읽는다고 함. 이름은 동사-명사 형태로 만들고 단어의 처음은 대문자로 표기한다.

파워셸 명령어 기본 별칭

? -> Where-Object                 % -> ForEach-Object               ac -> Add-Content
cat -> Get-Content                cd -> Set-Location                chdir -> Set-Location
clc -> Clear-Content              clear -> Clear-Host               clhy -> Clear-History
cli -> Clear-Item                 clp -> Clear-ItemProperty         cls -> Clear-Host
clv -> Clear-Variable             cnsn -> Connect-PSSession         compare -> Compare-Object
copy -> Copy-Item                 cp -> Copy-Item                   cpi -> Copy-Item
cpp -> Copy-ItemProperty          cvpa -> Convert-Path              dbp -> Disable-PSBreakpoint
del -> Remove-Item                diff -> Compare-Object            dir -> Get-ChildItem
dnsn -> Disconnect-PSSession      ebp -> Enable-PSBreakpoint        echo -> Write-Output
epal -> Export-Alias              epcsv -> Export-Csv               erase -> Remove-Item
etsn -> Enter-PSSession           exsn -> Exit-PSSession            fc -> Format-Custom
fhx -> Format-Hex                 fl -> Format-List                 foreach -> ForEach-Object
ft -> Format-Table                fw -> Format-Wide                 gal -> Get-Alias
gbp -> Get-PSBreakpoint           gc -> Get-Content                 gcb -> Get-Clipboard
gci -> Get-ChildItem              gcm -> Get-Command                gcs -> Get-PSCallStack
gdr -> Get-PSDrive                gerr -> Get-Error                 ghy -> Get-History
gi -> Get-Item                    gin -> Get-ComputerInfo           gjb -> Get-Job
gl -> Get-Location                gm -> Get-Member                  gmo -> Get-Module
gp -> Get-ItemProperty            gps -> Get-Process                gpv -> Get-ItemPropertyValue
group -> Group-Object             gsn -> Get-PSSession              gsv -> Get-Service
gtz -> Get-TimeZone               gu -> Get-Unique                  gv -> Get-Variable
h -> Get-History                  history -> Get-History            icm -> Invoke-Command
iex -> Invoke-Expression          ihy -> Invoke-History             ii -> Invoke-Item
ipal -> Import-Alias              ipcsv -> Import-Csv               ipmo -> Import-Module
irm -> Invoke-RestMethod          iwr -> Invoke-WebRequest          kill -> Stop-Process
ls -> Get-ChildItem               man -> help                       md -> mkdir
measure -> Measure-Object         mi -> Move-Item                   mount -> New-PSDrive
move -> Move-Item                 mp -> Move-ItemProperty           mv -> Move-Item
nal -> New-Alias                  ndr -> New-PSDrive                ni -> New-Item
nmo -> New-Module                 nsn -> New-PSSession              nv -> New-Variable
ogv -> Out-GridView               oh -> Out-Host                    popd -> Pop-Location
ps -> Get-Process                 pushd -> Push-Location            pwd -> Get-Location
r -> Invoke-History               rbp -> Remove-PSBreakpoint        rcjb -> Receive-Job
rcsn -> Receive-PSSession         rd -> Remove-Item                 rdr -> Remove-PSDrive
ren -> Rename-Item                ri -> Remove-Item                 rjb -> Remove-Job
rm -> Remove-Item                 rmdir -> Remove-Item              rmo -> Remove-Module
rni -> Rename-Item                rnp -> Rename-ItemProperty        rp -> Remove-ItemProperty
rsn -> Remove-PSSession           rv -> Remove-Variable             rvpa -> Resolve-Path
sajb -> Start-Job                 sal -> Set-Alias                  saps -> Start-Process
sasv -> Start-Service             sbp -> Set-PSBreakpoint           scb -> Set-Clipboard
select -> Select-Object           set -> Set-Variable               shcm -> Show-Command
si -> Set-Item                    sl -> Set-Location                sleep -> Start-Sleep
sls -> Select-String              sort -> Sort-Object               sp -> Set-ItemProperty
spjb -> Stop-Job                  spps -> Stop-Process              spsv -> Stop-Service
start -> Start-Process            stz -> Set-TimeZone               sv -> Set-Variable
tee -> Tee-Object                 type -> Get-Content               where -> Where-Object
wjb -> Wait-Job                   write -> Write-Output

Microsoft.Powershell.Core

https://learn.microsoft.com/ko-kr/powershell/module/microsoft.powershell.core/?view=powershell-7.4

Get-Command

명령어(cmdlet), 함수, 별칭을 가져온다. 특정 명령어의 실제 실행 파일 위치 찾을 때도 쓰인다.

# 명령어 explorer의 명령어타입, 이름, 버전, 소스(경로) 출력
Get-Command explorer

Get-History

명령어 실행 이력 보기. 기본 별칭 history

Get-History # 모든 명령어 이력 보기
Get-History 10 # 열 번째로 실행한 명령어 보기
Get-History -Count 10 # 명령어 이력을 마지막에서 거꾸로 10개만 보기

Invoke-History

기본 별칭 r, ihy

Invoke-History # 마지막 명령어 실행
Invoke-History -Id 132 # 132번 명령어 실행
Invoke-History 132 # 위와 같음

Where-Object

프로퍼티를 기준으로 컬렉션에서 개체를 선택한다.

# name 프로퍼티가 'httpd.exe'인 개체 선택해서 출력
Get-ChildItem | Where-Object name -eq 'httpd.exe'

# 확장자가 .jsp 이거나 .js 인 파일 출력
Get-ChildItem | Where-Object { $_.Extension -eq '.jsp' -or $_.Extension -eq '.js' }

Microsoft.PowerShell.Management

https://learn.microsoft.com/ko-kr/powershell/module/microsoft.powershell.management/?view=powershell-7.4

New-Item

파일이나 디렉터리, 심볼릭 링크 등을 생성한다.

# TARGET_PATH를 가리키는 심볼릭 링크 LINK 생성
New-Item -ItemType SymbolicLink -Path "LINK" -Target "TARGET_PATH"

Parameters

  • -ItemType: File, Directory, SymbolicLink, Junction, HardLink 중에 하나
  • -Path: 생성할 심볼릭 링크의 이름
  • -Target: 심볼릭 링크가 가리킬 대상 디렉터리

Get-Process

프로세스 가져오기. 기본 별칭은 psgps.

# PID가 2832 혹은 836인 프로세스 출력
Get-Process -Id 2832, 836

# 프로세스 이름 SoundSwitch인 프로세스 출력
Get-Process 'SoundSwitch'

Parameters

  • -Id: 하나 이상의 PID를 특정해서 필터링. 여러 개일 땐 쉼표,로 구분함
  • -Name: 하나 이상의 프로세스 이름을 특정해서 필터링. 여러 개일 땐 쉼표,로 구분하며 파라미터명 Name은 생략할 수 있음.

Start-Process

프로세스 시작. 기본 별칭은 saps.

Start-Process powershell –verb runAs # 관리자 권한으로 파워셸 실행
Start-Process explorer . # 현재 경로로 탐색기 실행(Start-Process는 생략 가능)

Stop-Process

하나 이상의 프로세스를 중지하는 명령어. 기본 별칭은 kill.

# 이름이 SoundSwitch인 프로세스를 중지. (Get-Process랑 다르게 -Name 생략 불가)
Stop-Process -Name 'SoundSwitch'

Get-Service

서비스 가져오기. 기본 별칭은 gsv.

Parameters

  • -Name: 파라미터의 값으로 서비스 이름을 특정한다. 와일드카드 사용 가능.

Stop-Service

하나 이상의 서비스를 중지하는 명령어. 기본 별칭은 spsv.

Stop-Service -Name "sysmonlog"

Get-Content

기본 별칭 type

Get-Content -Path nexus-2.14.5-02\logs\wrapper.log -Wait # 'tail -f'와 같음

Get-ChildItem

지정된 위치의 아이템이나 하위 아이템의 객체 정보를 가져온다. 아이템은 파일이나 디렉터리 중 하나다. 기본 별칭은 ls.

파라미터 없이 작동하지 않는 Get-Item과 다르게, Get-ChildItem은 명령어만 입력하면 현재 디렉터리 내에 있는 모든 파일과 디렉터리의 객체 정보를 가져온다.

# 현재 경로에서 재귀 검색 + 확장자가 js인 파일 찾기
Get-ChildItem -Recurse -Filter *.js

# c:\dev\git 경로에서 README.md를 숨긴파일 포함하여 재귀 검색하며 에러 났을 땐 그냥 넘어가고, 찾으면 경로와 파일명을 모두 출력
Get-ChildItem -Path C:/dev/git -Filter README.md -Recurse -Name -ErrorAction SilentlyContinue -Force

# 현재 경로에서 재귀 검색 + 확장자가 js인 파일 찾기 + FullName 프로퍼티를 콘솔 대신 temp2.md 파일에 쓰기
Get-ChildItem -Path . -Recurse -Filter *.js | Select-Object -Property FullName > temp.md

# 확장자가 js인 파일 찾기 + 파일의 전체 경로(=파일 객체의 FullName 프로퍼티)에서 "\target\"가 포함된 것은 제외
Get-ChildItem -Filter *.js | Where-Object { $_.FullName -notmatch '\\target\\' }

# 현재 경로에서 재귀 검색 + 확장자가 js인 파일 찾기 + 파일 내용 중 "axios"가 있는 라인 찾기 + 찾은 MatchInfo 객체에서 Path만 추출한 뒤 유일한 값만 출력
Get-ChildItem -Path . -Filter *.js -Recurse | Select-String -Pattern "axios" | Select-Object -Unique Path

# 현재 위치에서 모든 하위 파일과 폴더를 재귀 검색해서 출력하며 main.js로 필터링
Get-ChildItem -Recurse -Name | findstr main.js

Parameters

  • Filter: 특정 파일이나 폴더로 결과를 제한한다. 패턴은 와일드카드 패턴(Wildcard Patterns)이다.
  • Path: 명령을 수행할 경로(명령의 시작 위치)
  • Recurse: 재귀 검색
  • Name: 현재 폴더 기준, 상대 경로와 파일명을 한 줄에 같이 표시한다.
  • Include: ?
  • Exclude: ?
  • ErrorAction: ?
  • Force: ?

Copy-Item

기본 별칭 copy

Copy-Item .\dummy-for-copy.txt .\copy\clone.txt

Remove-Item

기본 별칭은 del, erase, rd, ri, rm, rmdir 많기도하네

Remove-Item .\copy\ -r -Force

Parameters

  • -Force: 확인 프롬프트 없이 삭제
  • -Recurse: 재귀 삭제

Get-Member

객체의 속성이나 메서드를 가져오는 명령어.

파이프라인을 통해 전달된 객체가 어떤 타입 혹은 어떤 클래스의 인스턴스인지 확인하려면 단순히 아래처럼 입력하면 된다:

[명령어] | Get-Member

이러면 TypeName 섹션에서 객체의 타입을 확인할 수 있다.

# System.IO.FileInfo, System.IO.DirectoryInfo 둘 중 하나
Get-ChildItem | Get-Member

# Microsoft.PowerShell.Commands.MatchInfo 타입
Get-ChildItem | Select-String foobar 

TODO 작동 방식 좀 더 분석

Parameters

  • -MemberType: 가져올 멤버의 타입을 지정한다.

Resolve-Path

지정된 아이템의 전체 경로를 출력한다. 기본 별칭은 rvpa.

# 홈 디렉터리의 경로 출력
Resolve-Path ~

# 모든 하위 아이템(파일, 디렉터리)들의 경로 출력
Resolve-Path *

# package.json 파일의 경로 출력
Resolve-Path .\package.json

# C:\Program Files 하위 아이템들의 경로 출력
'C:\Program Files\*' | Resolve-Path

# 현재 경로부터 홈 디렉터리까지의 상대 경로 출력
Resolve-Path -Relative ~

Test-Connection

cmd의 ping과 같은 명령어. 지정한 컴퓨터에 ping(혹은 ICMP 에코 요청)을 보내고 결과를 출력한다.

# KT 서버에 중단없이 연결 테스트 + 현재 시각 출력
Test-Connection -Repeat -ComputerName 168.126.63.1 | Format-Table @{Name='TimeStamp';Expression={Get-Date}},Address,ProtocolAddress,ResponseTime

# 위 명령의 ping 버전
ping -t 168.126.63.1 | Foreach{"{0} - {1}" -f (Get-Date),$_}

TODO 사실 위 코드에서 Test-Connection은 주고 받은 바이트, 시간, TTL은 표시되지 않음. 찾아서 추가할 것

Microsoft.Powershell.Utility

https://learn.microsoft.com/ko-kr/powershell/module/microsoft.powershell.utility/?view=powershell-7.4

Set-Variable

현재 콘솔에 변수를 추가하거나 재할당한다. 유효범위가 세션이 아니라 콘솔이라서 새 탭이나 새 창의 터미널은 해당 변수를 공유하지 못함. 기본 별칭은 set, sv

Set-Variable test abcd
$test
# abcd

Set-Variable -Name qwer -Value 1234
$qwer
# 1234

Get-Variable

변수 출력 명령어. 기본 별칭은 gv. 스코프를 지정하지 않으면 기본값은 로컬이다. 스코프에 대한 내용은 여기에서 확인.

# 로컬 스코프의 모든 변수 출력
Get-Variable

# m으로 시작하는 모든 로컬 변수의 이름과 값 출력
Get-Variable m*

# m으로 시작하는 모든 로컬 변수의 값만 출력
Get-Variable -Name m* -ValueOnly

# m 혹은 p로 시작하는 로컬 변수의 이름과 값 출력
Get-Variable -Include m*, p*

Get-Host

명령어를 입력하고 있는 호스트 프로그램(=파워셸)의 객체 정보를 출력함. 버전이나 언어 등이 나온다.

# 파워셸 버전 확인하기
Get-Host | Select-Object Version

Out-String

오브젝트를 문자열로 출력한다. 이렇게 활용 가능:

# pwsh 프로세스 출력 결과를 result.txt 파일에 쓰기
Get-Process -Name pwsh | Out-String | Set-Content -Path ./result.txt

Select-Object

객체나 객체의 프로퍼티를 선택하는 명령어. 보통은 다른 명령어와 파이프라인 입력으로 연결하여 사용한다.

# Get-ChildItem 결과의 처음부터 다섯 건만 출력
Get-ChildItem | Select-Object -First 5

# Get-ChildItem(=ls)으로 가져온 SOME_FILE의 객체 정보 중 디렉터리와 파일이름만 출력 
ls SOME_FILE | Select-Object -Property Directory, Name

# Get-Process에서 입력한 객체의 프로퍼티 중 ProcessName, Id, WS만 출력
Get-Process | Select-Object -Property ProcessName, Id, WS

Parameters

  • -First: 선택할 입력 객체의 수를 지정한다.
  • -Property: 선택할 프로퍼티를 지정함
  • -Unique: (보통은 파이프에 의해) 입력된 객체의 특정 프로퍼티를 기준으로 유일한 멤버만 선택

Select-String

문자열이나 파일에서 특정 문자를 찾는 명령어. grep이나 findstr과 비슷하다.

# 'Hello'와 'HELLO' 출력 라인 중 'HELLO'만 필터링하되 대소문자를 구분하며 단순 일치하는지 판단
'Hello', 'HELLO' | Select-String -Pattern 'HELLO' -CaseSensitive -SimpleMatch

# rogue.log 파일을 출력하되 대소문자 구분 없이 'exception'이 포함된 라인만 출력
Get-Content ./rogue.log | Select-String 'exception'

# 현재 경로의 모든 파일과 디렉터리를 Stream으로 내보내서 'httpd'가 포함된 라인 출력
Get-ChildItem | Out-String -Stream | Select-String 'httpd'

# detail.js에서 'qwer'가 몇 번 반복되는지 출력 
(Select-String -Path ./detail.js -Pattern qwer).Matches.Count

Parameters

  • -CaseSensitive: 대소문자를 구분하여 찾음. 생략하면 대소문자 무시.
  • -Pattern: 이어지는 문자로 각 줄에서 찾을 텍스트를 지정함. 패턴 값은 정규식으로 취급됨.
  • -SimpleMatch: 정규식 일치가 아니라 단순 일치로 필터링.
  • TODO

Select-String AND, OR, NOT

# AND: 'c'와 '1'이 모두 포함된 라인만 출력
'xyz', 'abc', 'abc123' | Select-String 'c' | Select-String '1'

# OR: 'z' 혹은 '1'이 포함된 라인만 출력
'xyz', 'abc', 'abc123' | Select-String 'z|1'

# NOT: 'abc'가 없는 라인만 출력
'xyz', 'abc', 'abc123' | Select-String -NotMatch 'abc'

Get-Alias

기본 별칭은 gal, alias. 설정된 별칭 목록을 출력한다.

Get-Alias # 설정된 모든 별칭 출력
alias | Select-String -Pattern 'jb' -CaseSensitive # 소문자 jb가 포함된 모든 별칭 출력
gal -Definition Get-Alias # 설정된 별칭 중에 Get-Alias의 별칭 출력

Set-Alias

신규 별칭 추가하거나 재할당한다. New-Alias도 있는데 요건 재할당이 안 되서 이미 있는 별칭이라면 에러가 발생한다.

# 탐색기의 별칭으로 ex 추가
Set-Alias ex explorer

# findstr의 별칭으로 grep 추가
Set-Alias grep findstr
# 위와 같음
Set-Alias -Name grep -Value findstr

이 명령을 터미널에서 직접 실행하면 현재 세션에서만 유효하게 된다. 앞으로의 모든 세션에 적용하려면 파워셸 프로필에 추가한다. 관련 문서.

일단 한 번 추가하면 프로파일의 파일 경로는 $PROFILE 변수로 찾을 수 있다:

code $PROFILE

만약 파라미터(=옵션)를 포함한 명령을 별칭으로 만들려면 프로필 파일에 아래처럼:

function Get-FilesIncludeHidden {
  Get-ChildItem -Force
}
Set-Alias -Name ll -Value Get-FilesIncludeHidden

함수를 정의하고 호출하도록 작성해야 한다. 관련문서, 관련문서2.

Write-Output

기본 별칭은 echo. 특정 객체를 파이프라인에 쓴다. 다른 cmdlet으로 파이프하거나 변수에 할당할 수 있다. 만약 Write-Output이 파이프라인의 마지막 명령인 경우 콘솔에 출력한다.

다른 명령어나 스크립트에서 발생하는 암시적인 출력은 Write-Output을 통한 출력이다.

# 파워셸 설치 경로 출력
Write-Output $PSHOME

# 비어있는 파일 생성. 'touch'와 같음
Write-Output $null >> dummy-for-commit.txt

Write-Host

기본 별칭은 없음. 오직 호스트 출력만을 위한 명령어. Write-Output과 달리 파이프라인에 보내지 않고 호스트에 직접 쓴다. 따라서 다른 cmdlet으로 파이프하거나 변수 할당은 불가능. 대신 색이나 구분자 등을 지정할 수 있다.

ℹ️ 파워셸에서 호스트란 파워셸 엔진이 실행되는 환경이다. 일반적으로 명령줄, 즉 콘솔이나 터미널을 의미함.

PS> Write-Host '$abc:'$abc
$abc: 123

Out-Host

기본 별칭은 oh. 호스트에 출력한다. 이 명령은 보통 출력 내용이 너무 길어서 페이징 처리가 필요할 때 사용한다.

# 하위 디렉터리를 한 페이지씩 출력
Get-ChildItem | Out-Host -Paging

Out-File

출력 내용을 파일로 내보낸다.

# 트리 명령의 출력 내용을 test.md 파일에 UTF-8 인코딩으로 내보내기
tree | Out-File -Encoding utf8 -FilePath tree.md

Parameters

  • -FilePath: 출력할 파일의 경로를 지정한다. 파라미터 이름이 생략된 전달인수는 이 파라미터로 간주된다.
  • -Encoding: 대상 파일의 인코딩을 지정한다 기본값은 utf8NoBOM이다. 유효한 값은 다음 중 하나다: ascii, ansi, bigendianunicode, bigendianutf32, oem, unicode, utf7, utf8, utf8BOM, utf8NoBOM, utf32
  • -Append: 기존 파일의 내용을 덮어쓰지 않고 이어 쓴다.
  • -Confirm: 명령을 실행하기 전에 프롬프트를 표시한다.
  • -Force: 읽기 전용 파일을 덮어 쓸 때 필요한 파라미터
  • -InputObject: TODO
  • -LiteralPath: TODO
  • -NoClobber: 기존 파일에 덮어쓰기를 시도하는 경우 메시지를 표시하고 명령을 중단시킨다.
  • -NoNewline: 파일 내용이 줄 바꿈 문자로 끝나지 않도록 한다.
  • -WhatIf: 명령을 실제로 수행하지는 않고 어떻게 될지만 표시한다.
  • -Width: 각 출력 줄의 최대 문자 수를 지정하는 파라미터. 이 값보다 길면 다음 줄에 출력한다.

Invoke-WebRequest

웹 요청을 날리는 명령어. 리눅스의 wget 혹은 curl에 해당한다. 기본 별칭은 iwr.

# 단순 요청
Invoke-WebRequest -Uri "https://google.com"

# 헤더와 바디를 지정하는 방법
# 백틱(`)은 파워셸에서 줄 바꿈을 의미함
Invoke-WebRequest -Method Get -Uri https://google.com/search `
  -Headers @{ 'Accept' = 'application/json'; 'X-My-Header' = 'Hello World' } `
  -Body @{ 'q' = 'Invoke-WebRequest+headers' }

# 파일 다운로드. OutFile 옵션으로 저장할 파일명을 지정함.
Invoke-WebRequest -Uri "https://code.visualstudio.com/sha/download?build=stable&os=win32-x64" -OutFile "vscode.exe"

Get-Filehash

지정한 파일의 해시값을 계산한다. 파라미터로 해시 알고리즘을 선택할 수 있고 생략하면 SHA256을 사용한다.

Get-FileHash FILE_NAME

# MD5 알고리즘을 사용하면서 세로 목록 포맷으로 출력
Get-FileHash FILE_NAME -Algorithm MD5 | Format-list

Parameters

  • -Algorithm: 해시값 계산에 사용할 해시 알고리즘(cryptographic hash function)을 지정한다. 이 파라미터를 생략하면 SHA256 알고리즘으로 계산한다. 유효한 값은 다음 중 하나다: SHA1, SHA256, SHA384, SHA512, MD5.