[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 배열 안에 있는 객체들의 순서가 바로:

터미널에서 새 탭을 열 때 선택할 수 있는 뇨솤들의 순서다.

변경된 환경 변수를 적용하려면

새 탭이나 새 창을 열어도 갱신되지 않으니 터미널 앱을 재실행할 것.

스크립트를 수정한 거라면 Dot sourcing operator.로 갱신 가능함.

Windows Command-Line Program 윈도우 명령줄 프로그램

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 control
  • M: Modify
  • RX: Read & execute
  • R: Read
  • W: Write

Handle

[Handle - Sysinternals Microsoft Learn](https://learn.microsoft.com/ko-kr/sysinternals/downloads/handle)

Microsoft Sysinternals에 포함된 빌드 도구로, Windows에서 어떤 프로세스가 파일이나 디렉터리 등의 리소스를 사용 중인지 확인하는 유틸리티다.

⚠️ 이 유틸리티로도 프로세스를 못찾는 경우가 많음 🤨

별도로 설치해야 실행할 수 있으니 Chocolatey로 설치하자:

choco install handle -y
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\fixal\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에서는 whereWhere-Object의 별칭이라서 .exe를 붙여줘야 함

ℹ️ PowerShell 명령어 Get-Commandwhere.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: 기존 대상 파일을 덮어쓸지 여부를 묻지 않는다.

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

파일의 해시값을 계산하거나 인증서 관련 정보를 관리하는 프로그램.

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

https://github.com/microsoft/winget-cli

Windows OS의 패키지 관리용 공식 CLI 툴. 리눅스의 apt와 비슷하다. Windows 버전에 따라 미리 설치되어 있기도 하다.

# 기본 도움말 보기
winget

# list 명의 도움말 보기
winget list --help

# KEYWORD로 패키지 검색
winget search KEYWORD

# PACKAGE_NAME 설치
winget install PACKAGE_NAME

# PACKAGE_NAME 제거
winget uninstall PACKAGE_NAME

# PACKAGE_NAME 패키지의 상세정보 표시
winget show PACKAGE_NAME

# 설치된 패키지 목록을 출력. 버전 업그레이드가 가능한지도 표시됨
winget list

# PACKAGE_NAME 패키지 버전 업그레이드
winget upgrade PACKAGE_NAME

이 외에 이런 하위 명령어가 있음:

  • winget source: 패키지 데이터의 출처를 관리할 때 씀
  • winget hash: 설치 관리자에 대한 SHA256 해시를 생성
  • winget validate: 매니페스트 파일의 유효성 검사
  • winget settings: WinGet 설정 파일을 열거나 관리자 설정을 관리한다.
  • winget features: 실험적 기능의 상태 표시
  • winget export: 설치된 패키지 목록 내보내기
  • winget import: 패키지 목록이 담긴 파일을 읽어 지정된 패키지를 설치한다.
  • winget pin: 특정 패키지의 업데이트를 제한하거나 버전을 고정한다.
  • winget configure: 구성 파일을 읽어 Windows 환경을 원하는 상태로 설정한다.

환경 변수

미리 설정되어 있는 Windows 환경 변수

  • %USERPROFILE%: 사용자 홈 폴더
  • %HOMEPATH%: 사용자 홈 폴더2, userprofile하고 뭔 차이인지…
  • %APPDATA%: 사용자 홈 + \AppData\Roaming
  • %LOCALAPPDATA%: 사용자 홈 + AppData\Local
  • %PROGRAMDATA%: C:\ProgramData
  • %HOMEDRIVE%: OS 설치 루트 경로. 보통은 C:\

그리고 이런거 추가해두면 개발에 모기 주둥이만큼 도움 됨:

  • desktop: C:\Users\fixalot\Desktop
  • tomcat-plugin: C:\project\workspace\.metadata\.plugins\org.eclipse.wst.server.core
  • JAVA_HOME: C:\Program Files\Java\jdk1.8.0_112

shell: 프로토콜

Windows의 특수 폴더(special folder)에 접근하는데 사용하는 명령어. 'shell: protocol' 혹은 'shell: commands'라 부른다.

이 특수 폴더들은 일종의 가상 폴더라서 실제 파일 시스템 경로가 없으며, 환경 변수처럼 직접 경로나 값을 읽을 수 없다.

그래서 그런지 파일 탐색기에서만 작동한다. 아직 셸에서 직접 경로를 얻는 방법은 못찾음. 셸에서 굳이 쓰겠다면, PowerShell에서는 explorer shell:AppData, CMD에서는 start shell:appsfolder와 같은 형태로 실행하는 방식으로만 가능하다.

아래는 shell: 프로토콜로 접근 가능한 특수 폴더의 목록이다:

  • shell:3D Objects
  • shell:AccountPictures
  • shell:AddNewProgramsFolder
  • shell:Administrative Tools
  • shell:AppData: AppData 디렉터리
  • shell:AppDataDesktop
  • shell:AppDataDocuments
  • shell:AppDataFavorites
  • shell:AppDataProgramData
  • shell:AppMods
  • shell:AppUpdatesFolder
  • shell:Application Shortcuts
  • shell:AppsFolder: 앱 실행 링크 파일 모여있는 곳
  • shell:CD Burning
  • shell:CSCFolder
  • shell:Cache
  • shell:Camera Roll
  • shell:CameraRollLibrary
  • shell:Captures
  • shell:ChangeRemoveProgramsFolder
  • shell:Common Administrative Tools
  • shell:Common AppData
  • shell:Common Desktop
  • shell:Common Documents
  • shell:Common Programs
  • shell:Common Start Menu
  • shell:Common Start Menu Places
  • shell:Common Startup
  • shell:Common Templates
  • shell:CommonDownloads
  • shell:CommonMusic
  • shell:CommonPictures
  • shell:CommonRingtones
  • shell:CommonVideo
  • shell:ConflictFolder
  • shell:ConnectionsFolder
  • shell:Contacts
  • shell:ControlPanelFolder
  • shell:Cookies
  • shell:CredentialManager
  • shell:CryptoKeys
  • shell:Desktop
  • shell:Development Files
  • shell:Device Metadata Store
  • shell:DocumentsLibrary
  • shell:Downloads
  • shell:DpapiKeys
  • shell:Favorites
  • shell:Fonts
  • shell:GameTasks
  • shell:History
  • shell:HomeGroupCurrentUserFolder
  • shell:HomeGroupFolder
  • shell:ImplicitAppShortcuts
  • shell:InternetFolder
  • shell:Libraries
  • shell:Links
  • shell:Local AppData
  • shell:Local Documents
  • shell:Local Downloads
  • shell:Local Music
  • shell:Local Pictures
  • shell:Local Videos
  • shell:LocalAppDataLow
  • shell:LocalizedResourcesDir
  • shell:MAPIFolder
  • shell:MusicLibrary
  • shell:My Music
  • shell:My Pictures
  • shell:My Video
  • shell:MyComputerFolder
  • shell:NetHood
  • shell:NetworkPlacesFolder
  • shell:OEM Links
  • shell:OneDrive: 원드라이브
  • shell:OneDriveCameraRoll
  • shell:OneDriveDocuments
  • shell:OneDriveMusic
  • shell:OneDrivePictures
  • shell:Original Images
  • shell:Personal
  • shell:PhotoAlbums
  • shell:PicturesLibrary
  • shell:Playlists
  • shell:PrintHood
  • shell:PrintersFolder
  • shell:Profile
  • shell:ProgramFiles
  • shell:ProgramFilesCommon
  • shell:ProgramFilesCommonX64
  • shell:ProgramFilesCommonX86
  • shell:ProgramFilesX64
  • shell:ProgramFilesX86
  • shell:Programs: 시작 메뉴의 프로그램 폴더
  • shell:Public
  • shell:PublicAccountPictures
  • shell:PublicGameTasks
  • shell:PublicLibraries
  • shell:Quick Launch
  • shell:Recent
  • shell:Recorded Calls
  • shell:RecordedTVLibrary
  • shell:RecycleBinFolder
  • shell:ResourceDir
  • shell:Retail Demo
  • shell:Ringtones
  • shell:Roamed Tile Images
  • shell:Roaming Tiles
  • shell:SavedGames
  • shell:SavedPictures
  • shell:SavedPicturesLibrary
  • shell:Screenshots
  • shell:SearchHistoryFolder
  • shell:SearchHomeFolder
  • shell:SearchTemplatesFolder
  • shell:SearchTemplatesFolder
  • shell:Searches
  • shell:SendTo
  • shell:Start Menu
  • shell:Startup: 시작 프로그램 폴더
  • shell:SyncCenterFolder
  • shell:SyncResultsFolder
  • shell:SyncSetupFolder
  • shell:System
  • shell:SystemCertificates
  • shell:SystemX86
  • shell:Templates
  • shell:ThisDeviceFolder
  • shell:ThisPCDesktopFolder
  • shell:User Pinned
  • shell:UserProfiles
  • shell:UserProgramFiles
  • shell:UserProgramFilesCommon
  • shell:UsersFilesFolder
  • shell:UsersLibrariesFolder
  • shell:VideosLibrary
  • shell:Windows