[Windows] Windows 노트
참고 문서
개요
Windows 10, 11에서 공통 사항 분리한 글
Windows 터미널
2020년인가… 새로 나온 Windows용 터미널. 앱 하나에서 Windows의 각종 셸(CMD, PowerShell, PowerShell Core, Azure Cloud Shell, WSL 등)을 동시에 사용할 수 있고, 창 쪼개기 기능(이게 세션도 분리되는건지는 아직 몲)을 지원함.
이 링크에서 설치하거나, 스토어에서 'Windows Terminal'을 검색하면 나온다.

이거 쓰고 있으면 좀 해커 같아 보임
터미널 단축키 변경
설정(ctrl + ,)에서 settings.json 열고 keybinding 항목을 수정하면 됨.
f1로 커맨드 팔레트 열기 ❌
{
"id": "Terminal.ToggleCommandPalette",
"keys": "f1"
},
{
"id": null,
"keys": "ctrl+shift+p"
},
설정 > 작업 메뉴를 열어서 변경해도 되…는데, 이렇게 했더니 셸의 안에서 f1 입력이 필요할 때 안되길래 되돌림. 예를 들어 htop에선 f1 입력으로 도움말을 연다.
클립보드 자동 복사
설정 > 상호 작용에서 선택 영역을 클립보드에 자동으로 복사 켜기
시작 위치 변경
ℹ️ Windows 터미널 버전이 올라가면서 GUI 설정으로도 변경할 수 있게 되었음. 새 탭 메뉴를 열어서 프로필 순서를 바꿔주면 된다. (없으면 하단의 + 표시를 눌러서 등록할 것)
터미널의 시작 위치를 변경하려면 설정 파일 settings.json을 아래처럼 수정한다. 해당 파일은 터미널 앱의 설정에서 좌측 하단 Json 파일 열기를 누르면 열림:
"profiles": {
"defaults": {},
"list": [
{
"guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"hidden": false,
"name": "PowerShell",
"source": "Windows.Terminal.PowershellCore",
"startingDirectory": "C:/dev"
}
... 생략
]
}
이런 식으로 startingDirectory를 추가하면 된다.
참고로 이 설정 파일에서 list 배열 안에 있는 객체들의 순서가 바로:

터미널에서 새 탭을 열 때 선택할 수 있는 뇨솤들의 순서다.
Git Bash 추가하기
터미널 설정에서 새 프로필 추가 > 새 빈 프로필 누르고 명령줄 항목을 다음처럼 입력한다:
C:\Program Files\Git\bin\bash.exe
⚠️ Git 설치 경로 기본값은 C:\Program Files\Git\이지만 다를 수도 있음
변경된 환경 변수를 적용하려면
새 탭이나 새 창을 열어도 갱신되지 않으니 터미널 앱을 재실행할 것.
스크립트를 수정한 거라면 Dot sourcing operator.로 갱신 가능함.
Windows Command-Line Utilities 윈도우 명령줄 유틸리티
Windows에서 명령줄 인터페이스를 통해 실행할 수 있는 독립적인 유틸리티다. 셸에 내장된 명령이 아니며, Windows에 기본 제공되는 유틸리티가 많다. 대체로 C:\Windows\System32\ 또는 C:\Windows\SysWOW64\에 위치한다.
icacls
파일/디렉터리의 권한(ACL)을 조회하고 수정하는 명령줄 유틸리티.
icacls .\test\
# .\test\ BUILTIN\Administrators:(I)(OI)(CI)(F)
# NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
# BUILTIN\Users:(I)(OI)(CI)(RX)
# NT AUTHORITY\Authenticated Users:(I)(M)
# NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M)
권한 태그
I: Inherited. 상위 디렉터리에서 상속된 권한OI: Object Inherit. 하위 파일로 권한 상속CI: Container Inherit. 하위 디렉터리로 권한 상속F: Full controlM: ModifyRX: Read & executeR: ReadW: Write
Handle
| [Handle - Sysinternals | Microsoft Learn](https://learn.microsoft.com/ko-kr/sysinternals/downloads/handle) |
Microsoft Sysinternals에 포함된 빌드 도구로, Windows에서 어떤 프로세스가 파일이나 디렉터리 등의 리소스를 사용 중인지 확인하는 유틸리티다.
⚠️ 이 유틸리티로도 프로세스를 못찾는 경우가 많음. 🤨 PowerToys에 비슷한 기능을 제공하는 File Locksmith가 있는데, 이 쪽이 더 잘 찾는다.
별도로 설치해야 실행할 수 있으니 WinGet으로 설치하자:
winget install -e --id Microsoft.Sysinternals.Handle
handle.exe "C:\project\test"
# explorer.exe pid: 1234 type: File C:\project\test\...
# node.exe pid: 5678 type: File C:\project\test\...
kill 1234
이렇게 파일을 잡고 있는 프로세스의 pid를 찾는데 쓴다.
실제 작동을 구현해보려면, 파워셸 창을 하나 열고 아래 입력:
$path = "$env:TEMP\handle-test.txt";
"test" | Set-Content $path;
$stream = [System.IO.File]::Open(
$path,
[System.IO.FileMode]::Open,
[System.IO.FileAccess]::Read,
[System.IO.FileShare]::None
);
다음으로 관리자 권한의 파워셸 창을 아래처럼 확인했을 때 pid가 나와야 정상:
handle.exe -au $env:temp\handle-test.txt
# ...
# pwsh.exe pid: 26616 type: File 10B4: C:\Users\사용자이름\AppData\Local\Temp\handle-test.txt
이제 첫 번째 파워셸에서 스트림을 닫으면:
$stream.Close();
관리자 파워셸에서 아무것도 안나와야 정상
handle.exe -au $env:temp\handle-test.txt
# ...
# No matching handles found.
where.exe
명령이나 실행 파일의 위치를 찾는 명령줄 유틸리티.
where.exe node
# C:\Program Files\nodejs\node.exe
# C:\Users\user\AppData\Local\hermes\node\node.exe
🚨 PowerShell에서는 where가 Where-Object의 별칭이라서 .exe를 붙여줘야 함
ℹ️ PowerShell 명령어 Get-Command가 where.exe를 대체한다.
find
특정 문자열을 검색하는 유틸리티. 다른 명령과 파이프로 연결해 출력을 필터링하는 용도로도 사용함.
dir | find "Videos" # "Videos"를 포함하는 행 출력
find 뒤에 오는 큰따옴표로 감싸진 문자열을 포함하는 행을 출력한다. /i 옵션이 없으면 대소문자를 구분함.
findstr
find와 비슷하지만 정규식 검색이 기본값인 유틸리티.
# '8081'로 필터링
netstat -nao | findstr '8081'
xcopy
파일과 디렉터리 트리를 복사하는 유틸리티.
xcopy SOURCE DESTINATION /s /e /y
Options
/S: 비어 있지 않은 디렉터리와 하위 디렉터리를 복사./E: 비어 있는 경우를 포함하여 디렉터리와 하위 디렉터리를 복사. /S /E 스위치와 같다./Y: 기존 대상 파일을 덮어쓸지 여부를 묻지 않는다.
robocopy
파일과 디렉터리 트리를 복사하는 유틸리티. xcopy의 후속 격으로, 재시도/미러링/멀티스레드 복사 등 더 강력한 기능을 제공한다.
robocopy SOURCE DESTINATION /e /z /mt
Options
/E: 비어 있는 경우를 포함하여 디렉터리와 하위 디렉터리를 복사./MIR: 대상을 원본과 동일하게 미러링한다(원본에 없는 대상 파일/디렉터리는 삭제됨). ⚠️ 대상 경로를 잘못 지정하면 파일이 삭제될 수 있으니 주의./Z: 네트워크 재시작 모드로 복사. 전송이 끊겨도 이어받기가 가능하다./MT[:N]: 멀티스레드로 복사한다.N을 생략하면 기본값 8개 스레드 사용./R:N: 실패 시 재시도 횟수 지정. 기본값은 100만 번으로 매우 크므로 보통 낮춰서 씀./W:N: 재시도 간 대기 시간(초). 기본값은 30초./LOG:파일: 진행 상황을 지정한 파일에 기록한다.
netstat
현재 컴퓨터의 네트워크 연결과 포트 상태를 보여주는 유틸리티.
# PID와 함께 모든 연결과 수신 대기 포트를 숫자 형식으로 출력하되
netstat -nao
# '8081'로 필터링
netstat -nao | findstr '8081'
nslookup
DNS 서버에서 도메인 정보를 조회하는 유틸리티.
# noritersand.github.io 도메인에 대한 DNS 정보 조회
nslookup noritersand.github.io
# dns.google.com 서버에서 icanhazip.com 검색
nslookup icanhazip.com dns.google.com
tasklist
실행 중인 프로세스 목록을 출력하는 유틸리티.
# 프로세스 목록을 출력하되 '18292'로 필터링
tasklist | findstr '18292'
taskkill
실행 중인 프로세스를 종료하는 유틸리티.
# PID가 5888인 프로세스 중지
taskkill /f /pid 5888
diskpart
Windows 전통의 디스크 관리 유틸리티. 디스크, 파티션, 볼륨 등을 확인하고 지정/변경할 수 있다.
diskpart
# Microsoft DiskPart 버전 10.0.18362.1
# ...
DISKPART> list volume
# 볼륨 ### Ltr 레이블 Fs 형식 크기 상태 정보
# -------- --- ---------- ---- --------- ------- ------------ --------
# Volume 0 시스템 예약 NTFS 파티션 549 MB 정상 시스템
# Volume 1 C NTFS 파티션 237 GB 정상 부팅
# Volume 2 D NTFS 파티션 931 GB 정상
DISKPART> list disk
# 디스크 ### 상태 크기 사용 가능 Dyn Gpt
# ---------- ------------- ------- ------------ --- ---
# 디스크 0 온라인 238 GB 1024 KB
# 디스크 1 온라인 931 GB 0 B
DISKPART> select disk 0
# 0 디스크가 선택한 디스크입니다.
DISKPART> list partition
# 파티션 ### 종류 크기 오프셋
# ---------- ---------------- ------- -------
# 파티션 1 주 549 MB 1024 KB
# 파티션 2 주 237 GB 550 MB
# 파티션 3 복구 562 MB 237 GB
route
라우팅 테이블을 출력하거나 수정하는 유틸리티
# 도움말 보기
route /?
# 기본 출력
route PRINT
ping
특정 IP나 도메인에 연결 확인용 데이터(ICMP Echo 요청)를 보내 응답 여부와 응답 시간을 확인하는 유틸리티. ICMP(Internet Control Message Protocol)를 사용하기 때문에 상대 컴퓨터에서 ICMP를 차단하면 네트워크 연결이 정상이어도 ping은 작동하지 않는다.
# KT 서버에 중단없이 연결 테스트 + 현재 시각 출력
ping -t 168.126.63.1
tree
지정한 드라이브 또는 경로의 디렉터리 구조를 트리 형태로 출력한다.
tree /f /a
수동으로 작성하고 싶으면 여기를 쓰자.
Options
/F: 각 디렉터리의 파일 이름도 같이 출력한다./A: 계층을 표현하는 특수문자를 ASCII 문자로 대체한다.
certutil
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certutil
파일의 해시값을 계산하거나 인증서 관련 정보를 관리하는 유틸리티.
certutil -hashfile 파일명 [해시알고리즘]
해시 알고리즘은 MD2, MD4, MD5, SHA1, SHA256, SHA384, SHA512 중에 하나여야 함. 생략했을 때의 기본값은 SHA1.
certutil -hashfile .\example.txt MD5
# SHA1의 .\example.txt 해시:
# f9c3df25f671c015100347d51cef76ee
# CertUtil: -hashfile 명령이 성공적으로 완료되었습니다.
WinGet (Windows Package Manager Client)
rg
강력한 터미널용 텍스트 검색 도구. 오픈소스 프로그램인 ripgrep을 설치하면 사용할 수 있다.
Windows 기본 프로그램이 아니라 별도로 설치해야 한다:
# WinGet
winget install BurntSushi.ripgrep.MSVC
# Chocolatey
choco install ripgrep
# Scoop
scoop install ripgrep
이 도구는 --files 옵션을 사용하지 않으면 기본적으로 파일의 내용 안에서 주어진 검색어를 검색한다.
그리고 -F 옵션을 사용하지 않으면 주어진 검색어를 기본적으로 정규식으로 해석한다.
# 현재 디렉터리와 그 하위를 재귀 검색
rg KEYWORD
# 특정 디렉터리에서 검색
rg KEYWORD src/
# 특정 파일에서 검색
rg KEYWORD App.tsx
# 여러 검색어를 OR 조건으로 검색
rg "A|B|C"
# 정규식으로 검색
rg "use[A-Z]\w+"
rg "^# " docs/
# 특정 확장자만 검색
rg KEYWORD -g "*.tsx"
# 여러 확장자 지정
rg KEYWORD -g "*.ts" -g "*.tsx"
# 특정 파일이나 디렉터리 제외
rg KEYWORD -g "!*.test.tsx"
rg KEYWORD -g "!node_modules"
# 검색 결과 주변 줄까지 출력
rg -C 2 KEYWORD
# 특정 문자열이 포함된 파일의 개수 확인
rg --count-matches KEYWORD
ℹ️ 검색어는 따옴표가 없어도 되지만, PowerShell에서는 |, $, * 같은 특수문자가 의미를 가질 수 있으니 이 경우에 한하여 따옴표로 감싸는 게 권장된다.
Options
-l--files-with-matches: 일치하는 내용이 있는 파일의 이름만 출력한다.-L--files-without-match: 일치하는 내용이 없는 파일의 이름만 출력한다.-i--ignore-case: 대소문자를 구분하지 않고 검색한다.-n--line-number: 검색 결과에 줄 번호를 표시한다. 기본 옵션.-N--no-line-number: 검색 결과에서 줄 번호를 표시하지 않는다.-g--glob: 특정 파일 패턴만 검색하거나 제외한다. 예:-g "*.tsx"-w--word-regexp: 단어 단위로 일치하는 경우만 검색한다.-F--fixed-strings: 검색어를 정규식이 아닌 일반 문자열로 취급한다.-C--context: 검색 결과 주변의 지정한 줄 수를 함께 출력한다. 예:-C 2--count-matches: 각 파일에서 검색어가 일치한 횟수를 출력한다.--files: 파일 내용을 검색하지 않고 검색 대상 파일 목록만 출력한다.--hidden: 숨김 파일과 디렉터리도 검색한다.--glob '!<패턴>': 특정 파일이나 디렉터리를 검색 대상에서 제외한다.-v--invert-match: 검색어와 일치하지 않는 줄을 출력한다.
환경 변수
미리 설정되어 있는 Windows 환경 변수
%USERPROFILE%: 사용자 홈 디렉터리%HOMEPATH%: 사용자 홈 디렉터리2,USERPROFILE하고 뭔 차이인지…%APPDATA%: 사용자 홈 +\AppData\Roaming%LOCALAPPDATA%: 사용자 홈 +AppData\Local%PROGRAMDATA%:C:\ProgramData%HOMEDRIVE%: OS 설치 루트 경로. 보통은C:\
그리고 이런거 추가해두면 개발에 모기 주둥이만큼 도움 됨:
desktop:C:\Users\사용자이름\Desktoptomcat-plugin:C:\project\workspace\.metadata\.plugins\org.eclipse.wst.server.coreJAVA_HOME:C:\Program Files\Java\jdk1.8.0_112
Shell Folders 셸 폴더
shell:Profile
shell:startup
shell:programs
Windows의 known folder에 접근하는데 사용하는 명령어. Known folder를 shell 문법으로 참조하는 형태다.
일종의 가상 폴더라서 실제 파일 시스템 경로가 없으며, 환경 변수처럼 직접 경로나 값을 읽을 수 없다. 그래서 그런지 파일 탐색기와 실행창에서만 작동한다.
ℹ️ 아직 셸에서 직접 경로를 얻는 방법은 못찾음. 셸에서 굳이 쓰겠다면, PowerShell에서는 explorer shell:AppData, CMD에서는 start shell:appsfolder와 같은 형태로 실행하는 방식으로 가능함.
현재 로그인 사용자
shell:AccountPicturesshell:AppData:C:\Users\사용자이름\AppData\RoamingAppData 폴더shell:AppDataDesktopshell:AppDataDocumentsshell:AppDataFavoritesshell:AppDataProgramDatashell:Application Shortcutsshell:AppsFolder: 앱 실행 링크 파일 모여있는 곳shell:Camera Rollshell:CameraRollLibraryshell:Capturesshell:Contactsshell:Cookiesshell:CredentialManagershell:CryptoKeysshell:Desktopshell:Development Filesshell:DocumentsLibraryshell:Downloadsshell:DpapiKeysshell:Favoritesshell:GameTasksshell:Historyshell:ImplicitAppShortcutsshell:Linksshell:Local AppDatashell:Local Documentsshell:Local Downloadsshell:Local Musicshell:Local Picturesshell:Local Videosshell:LocalAppDataLowshell:MAPIFoldershell:MusicLibraryshell:My Musicshell:My Picturesshell:My Videoshell:NetHoodshell:OEM Linksshell:OneDriveshell:OneDriveCameraRollshell:OneDriveDocumentsshell:OneDriveMusicshell:OneDrivePicturesshell:Original Imagesshell:Personalshell:PhotoAlbumsshell:PicturesLibraryshell:Playlistsshell:PrintHoodshell:Profile: 사용자 폴더shell:Programs:C:\Users\사용자이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs시작 메뉴의 프로그램 폴더shell:Quick Launchshell:Recentshell:Recorded Callsshell:RecordedTVLibraryshell:Ringtonesshell:Roamed Tile Imagesshell:Roaming Tilesshell:SavedGamesshell:SavedPicturesshell:SavedPicturesLibraryshell:Screenshotsshell:SearchHistoryFoldershell:SearchHomeFoldershell:SearchTemplatesFoldershell:Searchesshell:SendToshell:Start Menu:C:\Users\사용자이름\AppData\Roaming\Microsoft\Windows\Start Menu현재 사용자의 시작 메뉴 루트shell:Startup:C:\Users\사용자이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup시작 프로그램 폴더shell:SyncResultsFoldershell:SyncSetupFoldershell:Templatesshell:User Pinnedshell:UserProgramFilesshell:UserProgramFilesCommonshell:UsersFilesFoldershell:VideosLibrary
모든 사용자/공용
shell:Common Administrative Toolsshell:Common AppDatashell:Common Desktopshell:Common Documentsshell:Common Programs:C:\ProgramData\Microsoft\Windows\Start Menu\Programs모든 사용자 프로그램 메뉴shell:Common Start Menu:C:\ProgramData\Microsoft\Windows\Start Menu모든 사용자 시작 메뉴 루트shell:Common Start Menu Placesshell:Common Startupshell:Common Templatesshell:CommonDownloadsshell:CommonMusicshell:CommonPicturesshell:CommonRingtonesshell:CommonVideoshell:Publicshell:PublicAccountPicturesshell:PublicGameTasksshell:PublicLibraries
시스템 레벨 경로
shell:Fontsshell:ProgramFiles:C:\Program Filesshell:ProgramFilesCommon:C:\Program Files\Common Filesshell:ProgramFilesCommonX64shell:ProgramFilesCommonX86:C:\Program Files (x86)\Common Filesshell:ProgramFilesX64:C:\Program Filesshell:ProgramFilesX86:C:\Program Files (x86)shell:ResourceDirshell:Systemshell:SystemCertificatesshell:SystemX86shell:Windows
가상 경로
shell:3D Objectsshell:AddNewProgramsFoldershell:Administrative Toolsshell:AppModsshell:AppUpdatesFoldershell:CD Burningshell:CSCFoldershell:Cacheshell:ChangeRemoveProgramsFoldershell:ConflictFoldershell:ConnectionsFoldershell:ControlPanelFolder:제어판 > 모든 제어판 항목메뉴shell:Device Metadata Storeshell:HomeGroupCurrentUserFoldershell:HomeGroupFoldershell:InternetFoldershell:Librariesshell:LocalizedResourcesDirshell:MyComputerFoldershell:NetworkPlacesFoldershell:PrintersFoldershell:RecycleBinFoldershell:Retail Demoshell:SyncCenterFoldershell:ThisDeviceFoldershell:ThisPCDesktopFoldershell:UserProfilesshell:UsersLibrariesFolder