Winget shipped without PowerShell support

Why would you need that?

Published 2 minute read

I previously wrote about how impressed I was with winget, the official Windows package manager. This morning went to upgrade some packages on my system and received the following error:

winget upgrade --all -h

Package agreements were not agreed to. Operation cancelled.

Not the most descriptive error, but some cursory searching pulled up the --accept-package-agreements flag. But! it can’t be run with the --all flag, so you’d have grab each package that failed to upgrade and accept the agreement.

winget install --id Microsoft.PowerShell --accept-package-agreements

I had 3 packages failing the agreement check, so I thought I could be smart this morning and write a PowerShell script to automate this for me. That’s the great thing about package managers and the command line, right?

winget upgrade
Name                   Id                   Version Available Source
--------------------------------------------------------------------
OBS Studio             OBSProject.OBSStudio 28.1.2  29.0.2    winget
PowerShell 7.3.2.0-x64 Microsoft.PowerShell 7.3.2.0 7.3.3.0   winget
2 upgrades available.
2 package(s) have version numbers that cannot be determined. Use --include-unknown to see all results.

winget upgrade and winget list both output a table of packages. Armed with newfound knowledge of PowerShell’s Select-Object to grab a column, and GitHub CoPilot, I wrote the following script:

# list packages with an update
$packages = winget upgrade | Select-Object Id

# for each package with an update, install and accept agreements
$packages | ForEach-Object {
  $package = $_.split(" ")
  $package = $package[0]
  $package = $package.Trim()
  winget install $package --accept-package-agreements
}

…which immediately fails on line 2, because winget’s output is not a PowerShell object, breaking convention with most other things in Windows. The table that winget list and winget upgrade produced is a string!

There’s an open issue on GitHub for the lack of PowerShell support, and it looks like they’re slowly working on adding a PowerShell Module. That’s great, but I’m still surprised winget shipped without PowerShell support.