개요
winget(Windows Package Manager)은 데스크톱 애플리케이션을 검색·설치·업그레이드·제거하는 Microsoft의 공식 명령줄 도구다. 80장의 PackageManagement가 PowerShell cmdlet 프레임워크 안에서 여러 프로바이더를 통합했다면, winget은 그 자체로 독립된 네이티브 실행 파일(winget.exe)이며 PowerShell에서는 다른 외부 명령(1장에서 언급한 네이티브 명령 실행 방식)처럼 호출한다.
정신 모델은 “winget은 스마트폰의 앱 스토어를 명령줄로 옮겨온 것"이라는 것이다 — 데스크톱 GUI 프로그램(Chrome, VS Code, 7-Zip 등)을 검색해 자동으로 다운로드·설치까지 마쳐 준다는 점에서, PowerShell 모듈만 다루는 76장의 Install-Module보다 다루는 대상의 폭이 훨씬 넓다.
사용법
| |
종류
| 명령 | 역할 |
|---|---|
search | 사용 가능한 앱 검색 |
install | 지정한 앱 설치 |
upgrade | 설치된 앱을 최신 버전으로(--all로 전체 일괄 업그레이드) |
uninstall | 설치된 앱 제거 |
list | 현재 시스템에 설치된 패키지 목록 |
export/import | 설치된 패키지 목록을 파일로 내보내거나, 그 파일대로 일괄 설치(새 컴퓨터 셋업에 유용) |
Microsoft.WinGet.Client 모듈 | winget 기능을 PowerShell cmdlet(Find-WinGetPackage, Install-WinGetPackage 등)으로 감싼 공식 모듈 |
예시
| |
주의사항·함정
winget은 네이티브 실행 파일이라 출력이 구조화된 객체가 아니라 텍스트다: winget list의 결과는 10장에서 강조한 PowerShell 객체 파이프라인이 아니라 사람이 읽기 좋은 표 형태의 텍스트다. 이 출력을 프로그램적으로 파싱하려면 46장의 Select-String이나 문자열 분할로 직접 처리해야 하며, Where-Object로 속성을 걸러내는 것 같은 자연스러운 파이프라인 조작은 되지 않는다 — 구조화된 결과가 필요하다면 Microsoft.WinGet.Client 모듈의 cmdlet을 쓰는 편이 낫다.
관리자 권한 여부에 따라 설치 동작이 달라진다: 일부 앱은 설치 시 UAC(사용자 계정 컨트롤) 상승 프롬프트가 뜨는데, 관리자 권한 없이 winget install을 실행하면 사용자가 그 프롬프트를 승인해야 설치가 계속된다. 자동화 스크립트에서 사람의 개입 없이 실행해야 한다면, 관리자 권한 세션에서 실행하도록 스크립트를 설계해야 한다.
winget은 최초 사용자 로그인 후에야 등록이 완료된다: 새로 프로비저닝된 Windows 환경에서는 winget이 아직 등록되지 않아 명령을 찾을 수 없는 경우가 있다 — 이때는 Add-AppxPackage -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe로 수동 등록을 요청해야 한다.
이식성: winget은 macOS의 Homebrew(brew install), Linux 배포판의 apt/dnf와 정확히 같은 역할을 하는 Windows 전용 도구다. 세 도구 모두 “명령 하나로 GUI 애플리케이션까지 설치한다"는 목표는 같지만, winget은 PowerShell이나 CMD 어디서든 그냥 실행 파일처럼 호출된다는 점에서 76장의 Install-Module(PowerShell 전용 cmdlet)과 호출 방식이 근본적으로 다르다.
![Featured image of post [PowerShell] 81. winget과 PowerShell 통합](/post/powershell/winget-powershell-integration-powershell/wordcloud_hu_613ac0529568f6bf.webp)
![[PowerShell] 79. ForEach-Object -Parallel(PowerShell 7+)](/post/powershell/foreach-object-parallel-threadjob-powershell/wordcloud_hu_30c9034b5b05c027.webp)
![[PowerShell] 80. PackageManagement — Get-Package/Install-Package](/post/powershell/packagemanagement-get-install-package-powershell/wordcloud_hu_a30d460874a4540e.webp)
![[PowerShell] 81. winget과 PowerShell 통합](/post/powershell/winget-powershell-integration-powershell/wordcloud_hu_6eb945b79bb31a27.webp)
![[PowerShell] 82. PSWindowsUpdate — Windows 업데이트 관리 모듈](/post/powershell/pswindowsupdate-module-powershell/wordcloud_hu_3d62c398e34bd307.webp)
![[PowerShell] 83. PowerShell Remoting 개념과 WinRM 활성화](/post/powershell/powershell-remoting-winrm-enable-powershell/wordcloud_hu_4444c309846040dd.webp)
![[PowerShell] 24. 자동 변수 총정리 — $_, $null, $Error, $LASTEXITCODE](/post/powershell/automatic-variables-powershell-underscore-null/wordcloud_hu_fed154e062984d25.webp)
![[PowerShell] 00. 과정 개요와 커리큘럼](/post/powershell/getting-started-powershell/wordcloud_hu_15979a96cd2a594f.webp)
![[PowerShell] 100. Get-Credential과 PSCredential 객체](/post/powershell/get-credential-pscredential-object-powershell/wordcloud_hu_e8db052a57f9c242.webp)