Windows PowerShell 기본 명령어 익히기
Windows의 GUI 환경은 휼륭(최소한 Windows 10버전은)하지만 가끔은 마우스로 원하는 기능을 찾기가 정말 힘들 때가 있다.
특히 Windows에서 시험환경이나 반복되는 작업을 할 경우에는 아무래도 명령어라인 콘솔이 있으면 더 편리하게 작업을 할 수 있다.
윈도우즈10/11 환경에서 간단한 명령어로 조금 편하게 쓸 수 있는 기능들을 정리해 본다.
PowerShell 설명서를 사용하는 방법 페이지를 읽고 시작하자.
PowerShell 버전
먼저 도움말을 찾으려면 버전을 정확히 알고 있어야 한다.
Windows 10에는 기본으로 5.1 버전이 설치되어 있다.
PS C:\Users\softr> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.22621.1778
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.22621.1778
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PowerShell 프로파일 설정
Linux 최초 구동시 “.bashrc”와 같이 PowerShell 기본 설정은 아래의 명령어로 확인 할 수 있고 자신만의 명령어를 정의하려면 “CurrentUserCurrentHost” 파일에 추가해서 Alias 또는 function을 정의할 수 있다.
PS C:\Users\softr> $PROFILE | select *
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : C:\Users\softr\Documents\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : C:\Users\softr\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 75
기본 환경 설정 및 수정
Visual Studio Code를 사용한다면 터미널에서 code $PROFILE 하면 로그인 사용자의 기본 설정파일이 열린다. ( 기본 텍스트 편집도구 노트패드를 사용할 수 있다. notepad.exe $PROFILE )
아래와 같이 인코딩 설정과 기본 Function을 정의해서 사용한다.
$PROFILE에 내용을 수정한 후 ”. $PROFILE” 명령어로 변경 내용을 적용할 수 있다.
PowerShell 도움말
PowerShell의 명령어(cmdlet)는 익숙하지가 않아 무조건 찾아보는 편인데 명령어를 입력하고 Tab을 누르면 해당 구문으로 시작하는 명령어를 보여준다. (파라미터도 동일하게 - 을 입력후 Tab)
“Get-Help -Name 검색어”
-Online 옵션을 사용하면 도움말 사이트로 연결된다.
❯ Get-Help -Name Uninstall
Name Category Module Synopsis
---- -------- ------ --------
Uninstall-Package Cmdlet PackageManagement Uninstall-Package...
명령어 정리
PowerShell Comlet은 리눅스 bash 환경의 명령어와는 형식이 달라 접근하기가 어렵지만 명령어 뒤에 하이픈(-)을 치고 탭을 누르면 파라미터 목록들을 확인할 수 있는 등 편리한 기능들이 많다.
Windows Terminal에서 주로 쓰는 명령어를 정리해본다.
Get/Set-Alias
PowerShell에서는 Linux 명령어 형식의 명령어를 사용할 수 있는데 주요 명령어들이 Alias로 정의되어 있고 “Get-Alias”로 목록을 볼 수 있다.
❯ Get-Alias ls, md, cp, rm, history, kill, man, cat, grep
CommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem
Alias md -> mkdir
Alias cp -> Copy-Item
Alias rm -> Remove-Item
Alias history -> Get-History
Alias kill -> Stop-Process
Alias man -> help
Alias cat -> Get-Content
Alias grep -> Select-String
“Set-Alias”로 자신의 명령어를 정의할 수 있다. 아래와 같은 자신만의 명령어를 정의하여 $PROFILE 에 추가한다.
Set-Alias vi -Value vim
Set-Alias python -Value 'C:\Python39\python.exe'
Set-Alias grep -Value select-string
Set-Alias hash -Value Get-FileHash
Set-Alias find -Valie Get-ChildItem
Uninstall-Package : 설치된 프로그램 삭제
“Get-Package -Name Ahn*“ 명령어로 프로그램 이름을 찾을 수 있고 “Uninstall-Packages”로 설치된 패키지를 지울 수 있다.
PowerShell 7 에서는 Install-Packages로 설치한 패키지만 볼 수 있다.
❯ Uninstall-Package -Name ipMonitor10
경고: Reboot is required to complete the uninstallation
operation.
Name Version Source
---- ------- ------
ipMonitor10 10.9.1
Get-Content : 파일 정보 확인 및 출력
파일의 내용이나 정보 확인한다. (cmd 에서는 type이었던거 같은데)
cat, type 명령어도 모두 “Get-Content”와 매핑되어 있다. 유니코드 텍스트는 Get-Content -Encoding UTF8 .\README.md 와 같이 인코딩을 설정한다.
❯ Get-Content .\.wakatime.cfg
[settings]
debug = false
hidefilenames = false
ignore =
COMMIT_EDITMSG$
PULLREQ_EDITMSG$
MERGE_MSG$
TAG_EDITMSG$
api_key=0e64xxxx-xxxx-xxxx-xxxx-xxxx2865xxxx
> Get-Content -Encoding UTF8 FILENAME
Get-Process : 프로세스 정보 조회
PowerShell Comlet의 결과는 Object로 관리되고 해당 변수의 값을 가져올 수 있다.
아래와 같이 프로세스의 이름으로 찾거나 특정 TCP포트를 사용하는 프로세스 Id를 검색 하고 “Stop-Process -Name” 명령어로 Kill 할 수 있다.
❯ Get-Process -Name Excel
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
2637 120 340672 154236 177.05 22336 1 EXCEL
❯ Get-Process -Id (Get-NetTCPConnection -LocalPort 58803).OwningProcess
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
247 22 9216 20540 1.45 11060 1 python
❯ Get-Process | Where-Object WorkingSet -GT 200MB
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
553 29 294220 371320 4.17 2940 1 chrome
384 24 169596 228740 2.17 3516 1 chrome
885 37 350068 333012 161.72 4800 1 chrome
782 40 310540 268384 420.88 6356 1 chrome
720 38 188112 227416 5.66 7220 1 chrome
484 33 254968 326592 5.41 8676 1 chrome
560 30 268180 332336 21.13 8840 1 chrome
386 25 181316 234008 9.19 9856 1 chrome
517 28 266468 347180 6.02 14944 1 chrome
3847 117 456432 409476 2,551.25 23436 1 chrome
1234 78 473476 401984 97.58 23764 1 chrome
윈도우즈에서 열려있는 창의 목록을 확인
아래와 같이 Get-Title 함수를 $PROFILE에 추가할 수있다.
Function Get-Title { Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle -AutoSize }
Get-Process 결과에서 윈도우즈 타이틀 오브젝트를 선택하고 테이블 포맷으로 변경해서 표시한다.
> Get-Process | Where-Object {$_.mainWindowTitle} | Format-Table Id, Name, mainWindowtitle -AutoSize
Id Name MainWindowTitle
-- ---- ---------------
22624 ApplicationFrameHost 설정
23436 chrome Get-Process (Microsoft.PowerShell.Management) - PowerShell | Microsoft Learn - Chrome
23536 KakaoTalk 카카오톡
19884 stsess AhnLab Safe Transaction - Windows의 hosts 파일 변경이 탐지되었습니다. 악성코드에 의한 hosts 파일이 변경...
27088 SystemSettings 설정
16128 TextInputHost Windows 입력 환경
9032 WindowsTerminal Windows PowerShell
실행중인 프로세스 파일버전 표시.
특정 프로세스의 바이너리 정보를 확인할 때 사용한다.
❯ Get-Process liveview -FileVersionInfo
ProductVersion FileVersion FileName
-------------- ----------- --------
1.0.0.1 1.0.0.1 C:\IIOT-LIVEVIEW\LIVEVIEW.exe
Resolv-DnsName : 도메인의 IP 찾기.
nslookup 명령어를 사용해도 된다. (C:\Windows\System32\nslookup.exe)
가끔 도메인이 필요할 때가 있어 duckdns.org 서비스를 이용하는데 내 노트북의 IP가 제대로 업데이트 되었는지 확인 할 때 사용한다.
❯ Resolve-DnsName softroom.duckdns.org
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
softroom.duckdns.org A 60 Answer 106.xxx.xxx.xxx
디렉토리나 이름 및 파일 찾기
디렉토리에서 css 이름을 가진 디렉토리 찾기
Get-ChildItem -Directory Get-ChildItem -File
❯ Get-ChildItem -Directory | Where-Object { $_.Name -eq 'css' }
디렉터리: D:\Dropbox\Public\butteryoon.github.io
Mode LastWriteTime Length Name
---- ------------- ------ ----
da---- 2020-09-05 오후 7:32 css
지정한 하위 디렉토리 전체에서 특정이름을 가진 파일을 찾기
❯ Get-ChildItem -Path C:\ -Include svccare* -Recurse
디렉터리: C:\Program Files (x86)\infitec
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2017-12-13 오후 3:31 219520 svccare.exe
디렉터리: C:\Windows\Prefetch
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020-09-09 오후 2:11 10298 SVCCARE.EXE-642142C3.pf
인터넷에서 파일 다운로드
wget 명령어가 “Invoke-WebRequest”로 Alias 설정되어 있다.
PS C:\Users\softr> Get-Alias wget
CommandType Name Version Source
----------- ---- ------- ------
Alias wget -> Invoke-WebRequest
스크립트가 아니고 터미널에서 쓸 때는 wget.exe를 쓰는게 좋다.
Invoke-WebRequest 명령어는 반응이 쫌 느리다.
Invoke-WebRequest http://ax.itunes.apple.com/detection/itmsCheck.js -o itemsCheck.js
Windows Uptime
Linux의 uptime 명령어와 같은 기능이며 파워쉘 함수로 등록해서 사용한다.
Function uptime {Get-WmiObject -Class Win32_OperatingSystem | Select-Object @{n='LastBoot';e={$_.ConvertToDateTime($_.LastBootUpTime)}}}
LastBoot
--------
2020-10-14 오후 4:09:40
“PowerShell7”에서는 “Get-WmiObject” 대신 “Get-CimInstance” cmdlet을 사용한다.
❯ Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object LastBootUpTime
LastBootUpTime
--------------
2020-12-21 오후 3:34:05
HASH 함수
Linux에서 해시값을 구할 때 쓰는 md5sum, sha256 과 동일한 기능이다.
❯ Get-FileHash -Algorithm md5 .\README.md
Algorithm Hash Path
--------- -------------------------------- ---------
MD5 327FD51206F4DA87C368F467B067A73F README.md
❯ Get-FileHash -Algorithm sha256 .\README.md
Algorithm Hash Path
--------- ---------------------------- ----
SHA256 88F9ED20AB1ACDC0C8699A63174903C994670AEEB67B1725E147A937E8236B78 README.md
Symbolic Link
리눅스에서 “ln -s” 과 동일한 심볼릭링크 명령어로 링크를 걸 수 있다.
New-Item -ItemType SymbolicLink -Path “Link” -Target “Target”
❯ New-Item -ItemType SymbolicLink -Path Dropbox -Target D:\Dropbox\
Directory: C:\Users\softr
Mode LastWriteTime Length Name
---- ------------- ------ ----
l---- 2021-01-14 오후 5:49 Dropbox -> D:\Dropbox\
네트워크 재시작
WiFi와 이더넷 환경을 전환하다보면 인터넷이 연결이 되지 않는 경우가 있는데 이럴 때는 “어뎁터 설정 변경” 메뉴에서 특정 연결을 “사용안함”으로 바꿨다가 “사용”으로 하면 해결될 때가 있는데 이 기능을 터미널 상에서 하는 방법이다.
이더넷 어뎁터의 목록을 확인하고 (Get-NetAdapter) 이더넷 디바이스를 재시작(Restart-NetAdapter) 한다.
❯ Get-NetAdapter
Name InterfaceDescription ifIndex Status MacAddress LinkSpeed
---- -------------------- ------- ------ ---------- ---------
vEthernet (WSL) Hyper-V Virtual Ethernet Adapter 52 Up 00-15-5D-A5-83-9E 10 Gbps
Wi-Fi Qualcomm Atheros QCA9377 Wireless Netw… 7 Disconnected 74-DF-BF-69-F5-19 200 Mbps
이더넷 Realtek PCIe GbE Family Controller 4 Up 54-EE-75-AB-61-E9 1 Gbps
로컬 영역 연결 NexG SSL VPN Virtual Adapter - VPN 3 Disconnected 5E-84-92-54-22-4D 100 Mbps
❯ Restart-NetAdapter -Name "이더넷"
참고 URL
- 1장 - PowerShell 시작
- PowerShell이란?
- Windows Terminal Preview 릴리스
- execution of scripts is disabled on this system.
- Use Windows PowerShell to search for files