Windows Package Manager has matured fast, and by 2025 you can realistically manage almost your entire Windows software estate with a single command-line tool. Microsoft’s WinGet is now shipping with Windows 10/11 via App Installer and integrates with the Microsoft Store, but long-established ecosystems like Chocolatey and Scoop still have compelling strengths. This guide explains WinGet vs Chocolatey vs Scoop (2025): what to use and when, with practical examples, ready-to-use commands, and script snippets you can drop into your automation today.
You’ll get a side-by-side comparison, step-by-step instructions, YAML examples for WinGet Configuration-as-Code, and guidance for troubleshooting and automation in personal, enterprise, and CI/CD settings.
Overview of the Use Case
What this topic is about in plain language
- You want to automate software installation, updates, and removal on Windows using a package manager.
- You’re deciding between three popular tools: Microsoft’s WinGet, Chocolatey, and Scoop.
- You care about consistency (fresh installs), speed (bulk updates), and automation (DevBox, lab machines, CI/CD, Intune/Endpoint Manager).
Common scenarios where you need it
- Fresh OS installs or new developer workstations: quickly install a curated stack (browsers, IDEs, runtimes, CLI tools).
- Bulk updates: keep dozens or hundreds of apps patched without manually hunting download links.
- CI/CD pipelines: reproducible environments on build runners and ephemeral VMs.
- Enterprise device management: standardize fleets with version pinning, auditability, and Store integration.
- Offline or restricted networks: pre-download installers, use internal feeds, or leverage manifests.
Quick Reference Table
| Command | Purpose | Example Output |
|---|---|---|
| winget search vscode | Find packages by name (WinGet) | Name: Microsoft Visual Studio Code, Id: Microsoft.VisualStudioCode, Version: 1.93.0 |
| winget install –id Microsoft.PowerToys –silent –scope machine | Install a package silently (WinGet) | Successfully installed Microsoft.PowerToys |
| winget upgrade –all –include-unknown | Upgrade everything (WinGet) | 7 packages upgraded, 1 package skipped |
| winget export -o devbox.json –include-versions | Export installed apps (WinGet) | Exported 31 packages to devbox.json |
| choco install git -y | Install a package (Chocolatey) | Chocolatey installed 1/1 packages |
| choco upgrade all -y | Upgrade everything (Chocolatey) | Upgraded 12/12 packages |
| choco list –local-only | List installed (Chocolatey) | git 2.47.0, nodejs 22.5.1 |
| scoop install -g 7zip | Install portable app globally (Scoop) | Linking ~\scoop\apps\7zip\current… |
| scoop update * | Update all (Scoop) | Updated 18 apps |
| scoop bucket add extras | Add a community bucket (Scoop) | ‘extras’ bucket added |
Key Concepts and Prerequisites
Tools you’ll need
- WinGet (Windows Package Manager):
- Ships via Microsoft Store “App Installer” on Windows 10/11. Corporate images can include it offline.
- Check version with: winget –info
- PowerShell:
- Recommended for scripting across all three tools.
- Run as Administrator when installing system-wide software (machine scope).
- Admin rights:
- WinGet can install per-user or machine-wide; some apps require elevation.
- Chocolatey typically runs elevated for system installs.
- Scoop installs to your user profile by default (no admin required), with -g for global installs.
How to verify your WinGet version and sources
- Check version and any experimental features:
- winget –info
- Update the default source and MS Store source:
- winget source update
- winget source list
Typical constraints and their workarounds
- Corporate networks may block public endpoints; use internal feeds or pre-downloaded installers.
- Some packages need extra flags to avoid UI and EULAs:
- WinGet: –silent or –accept-package-agreements –accept-source-agreements
- Chocolatey: -y for non-interactive
- Scoop: portable installs rarely prompt, but some apps may
Step-by-Step Guide
H3: 1) Choose the right tool for your scenario
- Pick WinGet if you:
- Are on Windows 10/11, want an official Microsoft-backed catalog and Store integration.
- Need Intune/Endpoint Manager app deployment via “Microsoft Store app (new)” using WinGet Ids.
- Prefer strong hash validation and manifests curated for MSI/EXE/MSIX.
- Pick Chocolatey if you:
- Need mature Windows server automation, package scripts with rich install logic.
- Want packages.config workflows, private repos, and optional business features (central mgmt, internalization).
- Pick Scoop if you:
- Want developer-first, portable CLI tools without admin rights.
- Prefer easy version switching and “buckets” for cutting-edge or niche tools.
H3: 2) Install the package manager
WinGet
- On Windows 10/11, ensure App Installer (Microsoft Store) is installed/updated. Then:
- winget –info
- winget source update
Chocolatey (run in an elevated PowerShell)
- Set-ExecutionPolicy Bypass -Scope Process -Force; [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString(‘https://community.chocolatey.org/install.ps1‘))
- Verify:
- choco –version
Scoop (user install in PowerShell)
- Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
- iwr -useb get.scoop.sh | iex
- Optional: accelerate downloads: scoop install aria2
- Verify:
- scoop –version
H3: 3) Find and inspect packages
WinGet
- winget search firefox
- winget show –id Mozilla.Firefox –exact
- Tip: prefer –id + –exact to avoid “multiple installers found.”
Chocolatey
- choco search firefox
- choco info firefox
Scoop
- scoop bucket add extras
- scoop search firefox
- scoop info firefox
H3: 4) Install packages silently (per-user vs machine)
WinGet
- Per-user (no elevation required for most apps):
- winget install –id Microsoft.VisualStudioCode –silent –scope user
- Machine-wide (requires elevation):
- winget install –id Microsoft.PowerToys –silent –scope machine –accept-package-agreements
- Add exact version or locale:
- winget install –id Git.Git –version 2.47.0
- winget install –id Mozilla.Firefox –locale en-US
Chocolatey
- choco install googlechrome -y
- Version pin:
- choco install git –version 2.47.0 -y
Scoop
- scoop install ripgrep
- Global (requires elevation):
- scoop install -g 7zip
- Install a specific version (if available):
- scoop install nodejs@22.5.1
H3: 5) Bulk import/export for reproducible setups
WinGet export/import (JSON)
- Export what’s installed (with versions):
- winget export -o devbox.json –include-versions
- Import on a new machine:
- winget import -i .\devbox.json –accept-package-agreements –accept-source-agreements
- Tip: Use –ignore-unavailable to skip missing packages.
WinGet Configuration-as-Code (YAML)
- For more than just apps (settings, DSC-like resources), use WinGet Configure.
- Sample YAML (comments included):
yaml
devbox.yaml – WinGet Configure (2025)
Apply with:
winget configure –file .\devbox.yaml –accept-configuration-agreements
Requires WinGet with Configure feature enabled (winget –info)
properties:
configurationVersion: 0.2
resources:
- resource: Microsoft.WinGet.DSC/WinGetPackage
id: vscode
directives:
description: Install Visual Studio Code (user scope)
settings:
packageIdentifier: Microsoft.VisualStudioCode
installScope: user
source: winget
ensure: Present
allowUpgrade: true - resource: Microsoft.WinGet.DSC/WinGetPackage
id: powertoys
directives:
description: Install PowerToys machine-wide
settings:
packageIdentifier: Microsoft.PowerToys
installScope: machine
source: winget
ensure: Present
allowUpgrade: true
Chocolatey packages.config (XML)
- Export installed packages:
- choco export –output packages.config
- Reinstall from packages.config:
- choco install packages.config -y
- Note: You can also script choco list –local-only to build a package list if export is unavailable.
Scoop export/import
- Export list:
- scoop export > scoopfile.json
- Import on a new machine:
- scoop import .\scoopfile.json
- Pre-download installers for offline:
- scoop download git 7zip nodejs
H3: 6) Upgrading, pinning, and uninstalling
WinGet
- Upgrade all:
- winget upgrade –all –include-unknown
- Pin a version to avoid unintended upgrades:
- winget pin add –id Microsoft.VisualStudioCode –version 1.92.0
- List pins: winget pin list
- Remove pin: winget pin remove –id Microsoft.VisualStudioCode
- Uninstall:
- winget uninstall –id Mozilla.Firefox
Chocolatey
- Upgrade all:
- choco upgrade all -y
- Pin and unpin:
- choco pin add -n=git
- choco pin remove -n=git
- Uninstall:
- choco uninstall googlechrome -y
Scoop
- Update all:
- scoop update *
- Hold and unhold:
- scoop hold nodejs
- scoop unhold nodejs
- Uninstall:
- scoop uninstall ripgrep
H3: 7) Advanced installer parameters
WinGet
- Many MSI/EXE installers expose silent switches; WinGet handles most automatically via manifests.
- To pass custom parameters, use –override (for MSI/EXE):
- winget install –id Git.Git –silent –override “/COMPONENTS=icons,ext\reg”
- Common flags:
- –silent (or –interactive, –silent-with-progress)
- –accept-package-agreements –accept-source-agreements
- –scope user|machine
- –exact (match exact Id)
- –source winget|msstore
Chocolatey
- choco install vscode -y –params “‘/NoDesktopIcon /SuppressRefresh'”
- choco has package maintainers’ scripts; read choco info
for switches.
Scoop
- Mostly portable archives; no installer switches needed.
- For apps with installers, the manifest controls silent args; advanced users can override via custom manifests or buckets.
Troubleshooting
Common WinGet issues and fixes
- Hash mismatch or installer changed upstream:
- Try again after source update:
- winget source update
- Use a specific version if the latest is inconsistent:
- winget install –id App.Id –version x.y.z
- If urgent, and you trust the source, install from official vendor manually and report the issue to the WinGet repo.
- Try again after source update:
- Multiple installers found:
- Specify architecture/scope/locale:
- winget install –id App.Id –exact –scope machine –architecture x64 –locale en-US
- Specify architecture/scope/locale:
- Source index errors or missing results:
- Reset the source:
- winget source reset –force –name winget
- Re-add Store (if needed):
- winget source add -n msstore https://storeedgefd.dsx.mp.microsoft.com/v9.0
- Reset the source:
- Upgrades not detected:
- Use:
- winget list
- winget upgrade –all –include-unknown
- Some apps don’t expose version info consistently; pin or manage manually if required.
- Use:
Common Chocolatey issues and fixes
- Checksum errors:
- Wait for package maintainer to update; to proceed at your own risk:
- choco install
-y –ignore-checksums
- choco install
- Wait for package maintainer to update; to proceed at your own risk:
- Source problems or throttling:
- choco source list
- choco source disable -n chocolatey
- choco source add -n internal -s http://yourrepo/nuget
- Broken package state:
- choco uninstall
-y - choco clean -y
- choco install
-y
- choco uninstall
Common Scoop issues and fixes
- Stale bucket manifests:
- scoop update
- git -C “$(scoop prefix)/buckets/main” pull
- Cache or download failures:
- scoop cache rm -a
- scoop config proxy “http://proxy:8080” (if behind a proxy)
- App misbehaving after update:
- scoop reset
- scoop reset
- Health check:
- scoop checkup
Logging and diagnostics
- WinGet logs:
- %LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir
- Chocolatey logs:
- C:\ProgramData\chocolatey\logs
- Scoop logs:
- Check the PowerShell console output and the ~/.config/scoop directory
Automation Tips
H3: Use PowerShell to orchestrate all three
Scheduled weekly update script (run elevated if you manage machine-wide apps)
powershell
Update-WindowsPackages.ps1
Write-Host “Updating WinGet sources and apps…”
winget source update
winget upgrade –all –include-unknown –silent –accept-package-agreements
Write-Host “Updating Chocolatey apps…”
choco upgrade all -y
Write-Host “Updating Scoop apps…”
scoop update
scoop cleanup # remove old versions to free space
Schedule it via Task Scheduler under an admin account.
H3: DevBox bootstrap script (fresh install)
powershell
Bootstrap.ps1 – run as admin
Ensure managers exist or install them
if (-not (Get-Command winget -ErrorAction SilentlyContinue)) {
Write-Host “Please install App Installer from Microsoft Store for WinGet.”
}
if (-not (Get-Command choco -ErrorAction SilentlyContinue)) {
Set-ExecutionPolicy Bypass -Scope Process -Force
iex ((New-Object Net.WebClient).DownloadString(‘https://community.chocolatey.org/install.ps1‘))
}
if (-not (Get-Command scoop -ErrorAction SilentlyContinue)) {
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
iwr -useb get.scoop.sh | iex
}
WinGet installs
winget install –id Microsoft.PowerToys –silent –scope machine –accept-package-agreements
winget install –id Microsoft.VisualStudioCode –silent –scope user –accept-package-agreements
Chocolatey installs
choco install git 7zip -y
Scoop installs (user scope)
scoop bucket add extras
scoop install ripgrep fd
H3: WinGet in Intune/Endpoint Manager
- Use “Microsoft Store app (new)” and search by WinGet Id, e.g., Microsoft.PowerToys.
- Assign as Required to device groups for machine-wide installs, or Available for self-service.
- Version pinning can be achieved by specifying a particular version in your deployment or by using rings with pilot groups.
H3: CI/CD pipelines
- GitHub Actions (windows-latest runners include WinGet and often Chocolatey):
- steps:
- run: winget source update
- run: winget install –id Git.Git –silent –accept-package-agreements
- run: choco install nodejs -y
- run: scoop install jq
- steps:
- Azure DevOps Windows agents: similar commands in a Powershell task.
H3: Offline/restricted networks
- WinGet:
- Pre-fetch installers:
- winget download –id Microsoft.VisualStudioCode –output C:\OfflineCache
- Install with a local manifest that points to cached installer:
- winget install –manifest .\vscode.yaml
- Pre-fetch installers:
- Chocolatey:
- Use an internal NuGet-compatible feed (e.g., Nexus/Artifactory). Business features support internalization of package resources.
- Scoop:
- Pre-download:
- scoop download
- scoop download
- Host your own bucket Git repo with manifests pointing at internal mirrors.
- Pre-download:
Best Practices
- Prefer exact identifiers and versions
- WinGet: winget install –id Vendor.App –exact –version x.y.z
- Chocolatey: choco install app –version x.y.z -y
- Scoop: scoop install app@x.y.z
- Use pins to control drift
- WinGet: winget pin add –id App –version x.y.z
- Chocolatey: choco pin add -n=App
- Scoop: scoop hold App
- Standardize scope
- Use –scope machine for apps needed by all users; otherwise default to user installs for least privilege.
- Create reusable, readable manifests
- WinGet: adopt winget configure with clear YAML resources and comments.
- Chocolatey: keep packages.config or scripts in source control; document parameters.
- Scoop: maintain a custom bucket for internal apps or custom versions; review manifests for hash and URLs.
- Favor silent, unattended installs
- WinGet: –silent, –accept-package-agreements
- Chocolatey: -y, read package notes for additional params
- Scoop: typically silent by design
- Keep sources healthy
- winget source update; winget source reset if needed
- choco source list and prefer internal mirrors where possible
- scoop update; git pull buckets; audit third-party buckets
- Audit and log
- Capture logs per tool for compliance and troubleshooting.
- Test changes in a staging ring
- Especially for enterprise or shared images; validate major version bumps before production rollout.
Conclusion
WinGet vs Chocolatey vs Scoop (2025) isn’t about picking one “winner”—it’s about using the right tool in the right context:
- Use WinGet when you want Microsoft-backed manifests, Store integration, excellent enterprise alignment, and straightforward installs/upgrades with strong hashing.
- Use Chocolatey when you want rich scripted installs, server automation patterns, packages.config workflows, and optional business features for internalization and central management.
- Use Scoop when you want fast, portable, developer-centric tooling without admin rights, plus easy version switching via buckets.
With the commands and scripts above, you can install, export/import, upgrade, pin, and automate confidently. Try the examples on a test machine, keep versions pinned for critical apps, and you’ll find these package managers are safe, powerful, and a huge time-saver.
FAQ
H4: Is WinGet safe to use compared to Chocolatey and Scoop?
- Yes, WinGet is maintained by Microsoft and uses manifests with SHA256 hashes for verification. Chocolatey and Scoop are also broadly safe when using official sources, but always review manifests and trust only reputable buckets/sources. In enterprises, prefer internal mirrors and signed binaries.
H4: Can I use WinGet, Chocolatey, and Scoop together on the same machine?
- Yes. Many power users do. Keep in mind:
- Avoid installing the same app via multiple managers to reduce conflicts.
- Standardize scope (user vs machine).
- Document which manager “owns” which apps.
H4: Which manager is best for CI/CD pipelines?
- All three work. WinGet is excellent on Windows runners and aligns with Store apps; Chocolatey has a long server automation history; Scoop is fast for portable developer tooling. Choose based on your toolchain (e.g., node/python via Scoop; enterprise apps via WinGet/Chocolatey).
H4: How do I pin versions to prevent surprise upgrades?
- WinGet: winget pin add –id App –version x.y.z
- Chocolatey: choco pin add -n=App
- Scoop: scoop hold App or install a specific version (app@x.y.z)
H4: I’m behind a proxy or in an offline environment. What are my options?
- WinGet: pre-download with winget download; install from local manifests; consider internal repositories.
- Chocolatey: configure choco source to an internal NuGet feed; business editions support internalization.
- Scoop: scoop config proxy and scoop download; host your own bucket with internal URLs.
When to use which: a short cheat sheet
- WinGet:
- Windows 10/11 and Intune/Endpoint Manager integration
- Strong hashing, Store support, simple silent installs
- Chocolatey:
- Server/enterprise automation with rich scripting
- packages.config workflows, internal repos, optional business features
- Scoop:
- Developer workstations, portable CLI tools, no admin rights
- Buckets for multiple versions and niche tools
Appendix: Additional helpful commands
WinGet
- winget list –source winget
- winget show –id App.Id –exact –versions
- winget settings export > winget-settings.json
Chocolatey
- choco outdated
- choco feature list
- choco config list
Scoop
- scoop list
- scoop cleanup *
- scoop bucket known
Use these building blocks to assemble a package management strategy that matches your environment’s needs today and scales smoothly into tomorrow.
