winget, a command line package manager, doesn't have a command line installer? 🤣 Now it does! 😊
Note
Microsoft released some new short URLs that work well for installing winget. This is the new script that is smaller and faster at installing winget!
- Requirements
- Features
- Script Functionality
- Setup
- Parameters
- Global Variables
- Troubleshooting
- Contributing
- Requires PowerShell running with Administrator rights
- Compatible with:
- Windows 10 (Version 1809 or higher)
- Windows 11
- Server 2022
- Windows Sandbox
- Not compatible with:
- Server 2019 (winget not supported)
- Installs winget-cli directly from PowerShell
- Always fetches the latest
winget
version - Automatically verifies OS compatibility
- Determines and installs the appropriate prerequisites based on OS version
- Supports x86/x64 and arm/arm64 architectures
- Allows bypassing of existing
winget
installation verification through-Force
parameter or$Force
session variable - Supports irm/iex one-line command using short URL
- Supports automatically relaunching in conhost and ending active processes associated with winget that could interfere with the installation
- Code is hosted on PowerShell Gallery
- Identifies processor architecture to decide which prerequisites are needed (x86/x64 or arm/arm64)
- Checks Windows OS version for compatibility (Windows 10, Windows 11, Server 2022)
- Verifies Windows 10 release ID for compatibility (must be 1809 or newer)
- Uses the UI.Xaml and VCLibs as recommended by Microsoft
- The winget-cli license is downloaded using the latest version from GitHub
- winget-cli is then installed using the latest version from GitHub
- Runs command registration if the
winget
command is not detected at the end of installation
Tip
If you want to trust PSGallery so you aren't prompted each time you run this command, or if you're scripting this and want to ensure the script isn't interrupted the first time it runs...
Install-PackageProvider -Name "NuGet" -Force
Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted
This is the recommended method, because it always gets the public release that has been tested, it's easy to remember, and supports all parameters.
Open PowerShell as Administrator and type
Install-Script winget-install -Force
Follow the prompts to complete the installation (you can tap A
to accept all prompts or Y
to select them individually.
Note: -Force
is optional but recommended, as it will force the script to update if it is outdated. If you do not use -Force
, it will not overwrite the script if outdated.
winget-install
If winget
is already installed, you can use the -Force
parameter to force the script to run anyway.
The script is published on PowerShell Gallery under winget-install
.
The URL asheroto.com/winget always redirects to the latest code-signed release of the script.
If you just need to run the basic script without any parameters, you can use the following one-line command:
irm asheroto.com/winget | iex
Due to the nature of how PowerShell works, you won't be able to use any parameters like -Force
with this command line. You can set the global variable $Force
to $true
and the script should pick up on it (more info), but if for some reason that doesn't work or you absolutely need to use a one-line command with parameters, you can use the following:
&([ScriptBlock]::Create((irm asheroto.com/winget))) -Force
To make it easier to remember, you can also use the URL winget.pro which redirects to the same URL. This URL is provided courtesy of Omaha Consulting.
irm winget.pro | iex
Due to the nature of how PowerShell works, you won't be able to use any parameters like -Force
with this command line. You can set the global variable $Force
to $true
and the script should pick up on it (more info), but if for some reason that doesn't work or you absolutely need to use a one-line command with parameters, you can use the following:
&([ScriptBlock]::Create((irm winget.pro))) -Force
Alternatively, you can of course use the latest code-signed release URL directly:
irm https://github.com/asheroto/winget-install/releases/latest/download/winget-install.ps1 | iex
As a more conventional approach, download the latest winget-install.ps1 from Releases, then run the script as follows:
.\winget-install.ps1
You can use the -Force
or -ForceClose
parameters if needed, or use $Force = $true
and $ForceClose = $true
global session variables if preferred.
Tip
If for some reason your PowerShell window closes at the end of the script and you don't want it to, or don't want your other scripts to be interrupted, you can wrap the command in a powershell "COMMAND HERE"
. For example, powershell "irm asheroto.com/winget | iex"
.
No parameters are required to run the script, but there are some optional parameters to use if needed.
Parameter | Description |
---|---|
-Debug |
Enables debug mode, which shows additional information for debugging. |
-Force |
Ensures installation of winget and its dependencies, even if already present. |
-ForceClose |
Windows Terminal sometimes has trouble installing winget; run the script with the -ForceClose parameter to relaunch the script in conhost.exe and automatically end active processes associated with winget that could interfere with the installation |
-CheckForUpdate |
Checks if there is an update available for the script. |
-Wait |
By default, the script will exit immediately after completion. If you need some time to observe the script output, you can use this parameter to force the script to pause for several seconds before exiting. |
-UpdateSelf |
Updates the script to the latest version. |
-Version |
Displays the version of the script. |
-Help |
Displays the full help information for the script. |
winget-install -Force
Global variables are optional and are only needed if you don't want to use parameters. They can be set before running the script, or you can set them in your PowerShell profile to always use them.
Variable | Description |
---|---|
$Debug |
Enables debug mode, which shows additional information for debugging. |
$Force |
Ensures installation of winget and its dependencies, even if already present. |
$ForceClose |
Windows Terminal sometimes has trouble installing winget; run the script with the -ForceClose parameter to relaunch the script in conhost.exe and automatically end active processes associated with winget that could interfere with the installation |
$Force = $true
winget-install
- Before releasing a new version, the script is tested on a clean install of Windows 10 22H2, Server 2022 21H2, and Windows 11 22H2
- If you run into an issue, please ensure your system is compatible & fully updated
- Sometimes PowerShell accidentally closes the window before you can read the output, so you can use the
-Wait
parameter to pause the script for a few seconds before exiting if this is happening on your system - Try running
winget-install
again, sometimes the script will fail due to a temporary issue with the prerequisite server URLs - Try using the
-Debug
parameters to see if it provides any additional information - If you're getting a
resource in use
error message, run the script again with the-ForceClose
parameter - Try installing winget manually to see if the issue exists with winget itself
- If the issue occurs when installing winget manually, please open an issue on the winget-cli repo (unrelated to this script)
- Check the winget-cli Troubleshooting Guide
- If the problem only occurs when using this script, please open an issue here
If you'd like to help develop this project: fork the repo, edit the code, then submit a pull request. 😊