- Description
- Installation
- Upgrading
- Update-WinGetSoftware
- Checkpoint-WinGetSoftware
- Restore-WinGetSoftware
- Initialize-WinGetIgnore
- Initialize-WinGetRestore
- Merge-WinGetRestore
- Additional Notes
Provides functionality for improved software management. This module includes the following primary functionality:
- A simple CLI interface for
winget update:- Ignore-Package support, via a
winget.{HOSTNAME}.ignorefile. - Tab-completion for locally-cached upgradable packages.
- An interactive UI for selecting which packages to install.
- Elevation option to instruct the tool to perform the install as an Administrator.
- Ignore-Package support, via a
- A tag-based deployment tool:
- Installation of suites of self-maintained tagged package-identifiers.
- Elevation option to instruct the tool to perform the install as an Administrator.
- A helper cmdlet to detect new package identifiers that have not yet been
entered into
winget.packages.json.
- A basic checkpoint command:
- Takes a backup of the last checkpoint.
- Saves a list of installed software with version info.
- This is mostly an alias for
winget export --include-versions.
Download/install the module from PSGallery:
Install-Module -Name WinGet-Essentials -Repository PSGalleryAdd the module to your $PROFILE:
Import-Module WinGet-EssentialsFor first time users, the following steps are recommended for setting up the various resources needed by the cmdlets:
-
Open an Administrator instance of PowerShell
- Note: This is only necessary if the user's
Local Security Policydoes not include them in theCreate symbolic linksentry'sSecurity Setting. This may be modified under "Local Policies\User Rights Assignment\Create symbolic links".
- Note: This is only necessary if the user's
-
Change directory to a folder where you wish to store the physical copy of the resource files (i.e. the ignore and package list files).
-
Run:
$ignoreFile = New-Item "winget.$((hostname).ToLower()).ignore" $packagesFile = New-Item "winget.packages.json" Initialize-WinGetIgnore -SourceFile $ignoreFile Initialize-WinGetRestore -SourceFile $packagesFile
-
Run the following which will capture the installed software available on WinGet and provide a UI to select what package IDs to add to the list of restorable packages. After making the selections the user will be prompted to tag each of these packages. The
-MergeAllswitch skips a follow up confirmation after the selections have been made from the UI:Merge-WinGetRestore -UseUI -MergeAll
-
Finally, for any of the packages you opt'd not to add to
winget.packages.jsonconsider adding these to the ignore file that was just created (each entry should be on its own line).
With the above steps in place, the majority of this module's cmdlets can generally be used without administrator privileges, but for installation of packages, this will depend on the particular package and whether they support elevation of permissions.
To upgrade from a previously configured installation to a newer release of the module, in an Administrator instance of PowerShell, run:
Update-WinGetEssentialsNote
Module versions >= 1.11.0 do not require this command to run in an Admin instance, so long as the user has permissions to create SymLinks.
If desired, it is also possible to perform a more manual upgrade process using
Update-Module as shown below and performing the additional actions outlined
in the paragraphs that follow.
Update-Module -Name WinGet-EssentialsNote
If the WinGet-Essentials module is already loaded, restart the terminal or
reload the module explicitly via Remove-Module followed by Import-Module.
After Upgrade-Module completes, it is advisable to run the following commands
in an administrator PowerShell instance to allow new symbolic links to be
created. Some cmdlets will attempt to perform this automatically, but it will
only be possible to create a SymLink if the cmdlet is running in an
administrator PowerShell instance.
Initialize-WinGetIgnore
Initialize-WinGetRestoreIt may also be desirable to run the following to have other resources/functions
ready to use (such as tab-completion for package IDs with
Update-WinGetSoftware or use of Restore-WinGetSoftware):
Checkpoint-WinGetSoftware
Update-WinGetSoftware -SyncNote
The commands above will find the previous module install to determine where
the resource files reside. If no such files existed, then it will be necessary
to provide the -SourceFile parameter to the associated cmdlets.
Provides a basic UI for updating software available in a WinGet repository.
winget-updatewinup
To selectively install updates using a simple UI run:
Update-WinGetSoftwareTo install a specific package run (supports tab-completion for cached updatable package IDs):
Update-WinGetSoftware <WinGetPackageID>[,<AnotherWinGetPackageID>]To update the cached list of upgradable package IDs, run:
Update-WinGetSoftware -SyncStores a snapshot of installed software, including versions. This can be used
by WinGet natively to reinstall the listed software. This cmdlet's output
is also needed by other functionality of this module, namely Merge-WinGetSoftware
and Restore-WinGetSoftware (when using the -NotInstalled switch).
The checkpoint file and its backup are stored in the same path that this module resides in. This path may for instance be:
$env:USERPROFILE\Documents\PowerShell\Modules\WinGet-Essentials\<MODULE_VERSION>\modules
Warning
Uninstall-Module will indiscriminately remove files in the associated
module's directory. Consider moving these files to another location. A future
version of this module will likely provide a user-configurable way to redirect
this file to other locations.
winget-checkpoint
Checkpoint-WinGetSoftwareRestores a set of software packages based on a locally, user-managed,
winget.packages.json (see Initialize-WinGetRestore section below for details
on initializing this file).
The set of packages to be installed/restored is determined by tags. The tags
can be used in two ways: AND-comparison or OR-comparison. This is determined
by the -MatchAny switch parameter (default behavior is to Match All tags).
This cmdlet supports tab completions for the user-defined tags found in the
winget.packages.json file. A -NotInstalled switch can be specified which
will filter out package IDs that are found in the current checkpoint file
generated from Checkpoint-WinGetSoftware.
winget-restore
Example: All packages containing both "Dev" and "Essential" tags will be presented in a UI for user refinement of which packages to install.
Restore-WinGetSoftware -Tag Dev,Essential -UseUIExample: Install all packages tagged with any of the following: "Essential", "Desktop" but not containing "Dev".
Restore-WinGetSoftware -Tag Essential,Desktop -MatchAny -ExcludeTag DevA helper for initializing an instance of winget.{HOSTNAME}.ignore for the
current module version. This cmdlet is also called internally by the cmdlets
to attempt automatic migration of previous winget.{HOSTNAME}.ignore
instances to the current version.
To ignore a specific package from appearing in the various supported cmdlets,
the software package's corresponding PackageIdentifier (as indicated by the
winget command) is to be added to a new line entry in the associated
winget.{HOSTNAME}.ignore. Each line should contain a single winget package ID
(verbatim).
Note
At this time, wild cards are not supported, but may be introduced in a future update.
With a winget.{HOSTNAME}.ignore run the following command in an
Adminstrator PowerShell:
Initialize-WinGetIgnore -SourceFile .\winget.{HOSTNAME}.ignoreNote
The {HOSTNAME} section should be replaced with the name of the computer as
determined by the hostname command. Technically, the name of this source
file may be given any name so long as it is symbolically linked, however
this naming scheme is used to support a centralized cloud backup location
where multiple ignore files exist targeting different computers.
Warning
While it is possible to have a hard copy of this ignore file placed in
the module folder, it is recommended to use this cmdlet so that a
symbolic link is used. This is to avoid accidental deletion during
Uninstall-Module. It also reduces maintenance issues by allowing one
copy of the file to be used across multiple versions of the module (assuming
there are no compatibility issues between the versions).
A helper for initializing an instance of winget.packages.json for the current
Restore-WinGetSoftware cmdlet. The Initialize-WinGetRestore cmdlet is also
called internally by Restore-WinGetSoftware to handle migrating previous
winget.packages.json instances to the current version.
When using this Restore-WinGetSoftware for the first time, the user needs
to manually create/define this JSON file and ideally, create a SymLink to it
(see the Installation section above for details).
This for instance, may be placed in a cloud backup folder that syncs between
computers so that the package list is shared between multiple systems that
are to have similar software packages installed.
This JSON file is to contain an array of objects describing each package of interest. It should, at a minimum, have the following form:
[
{
"PackageIdentifier": "<WINGET_PACKAGE_ID1>",
"Tags": [
"<MY_TAG1>",
"<MY_TAG2>",
]
},
{
"PackageIdentifier": "<WINGET_PACKAGE_ID2>",
"Tags": [
"<MY_TAG1>",
"<MY_TAG3>",
]
}
]Each entry above may specify various optional key-values which include:
- Install Location
- Package Version
- Both weak and strong version locking can be specified through the inclusion
or omission of the
VersionLockkey.
- Both weak and strong version locking can be specified through the inclusion
or omission of the
- Interactive Install
- Force the install command for a specific
PackageIdentifierto always include--interactive. This remains true even-Forceis specified.
- Force the install command for a specific
- Additional Arguments
- Arguments may be passed directly to
wingetto expose all other command options that have not been specifically supported by this JSON format.
- Arguments may be passed directly to
- Post-installation Commands
- Supports execution with various control options (error handling/prompts).
Further details available in packages.schema.json
When editing the winget.packages.json file, a user may use the available
schema-file for assistance and validation. The following entry may be added
(replacing <PATH_TO_MODULE> with the location to the installed
WinGet-Essentials module) to a VS Code's user/workspace settings (assuming the
file is given the default name of winget.packages.json):
"json.schemas": [
{
"fileMatch": [
"/winget.packages.json"
],
"url": "<PATH_TO_MODULE>/modules/schema/packages.schema.json"
}
]Note
Behavior is subject to change in the future.
As a side-effect of adding CI testing, there was a need to create a fake
PackageIdentifier as a way to skip potentially lengthy winget install
requests during test execution and to allow more control over how test execution
flows through the PowerShell logic. A PackageIdentifier following the form,
<*> will be detected as fake (where * is a wildcard and represents the
user-defined name of the fake package):
Because of this, it is possible to specify winget.packages.json entries
that do not point to a software package to install, rather a series of
commands/scripts via the PostInstall functionality. However, one current
limitation of this feature is there is no guarantee that -NotInstalled will
work correctly for these packages as they exist outside the scope of winget.
While it is certainly handy to provide a unified way to download all tools via one interface, the current advice is to use this feature sparingly.
Below is an example entry for installing python (version 3.11) from winget
and disabling the winstore aliases during post-installation. If an error
occurs during install or during post-install command execution the user will be
prompted.
{
"PackageIdentifier": "Python.Python.3.11",
"Tags": [
"Dev",
"Essential"
],
"PostInstall": {
"Commands": [
"Remove-Item \"$env:LOCALAPPDATA\\Microsoft\\WindowsApps\\python.exe\"",
"Remove-Item \"$env:LOCALAPPDATA\\Microsoft\\WindowsApps\\python3.exe\""
],
"Run": "OnSuccess",
"OnError": "Prompt"
}
}With a winget.packages.json created run in an Adminstrator PowerShell:
Initialize-WinGetRestore -SourceFile .\winget.packages.jsonA helper for detecting package IDs installed on the host system that are not
present in winget.packages.json. This cmdlet will confirm with the user
whether or not to add the package to the file. If added, the user will also
be asked what tags to assign the package (if any).
Running the command below on two or more systems sharing the same
winget.packages.json (i.e. via file sync / cloud storage solutions) will allow
the user to easily create a superset of software package IDs.
Merge-WinGetRestoreOne feature that might be missing from a tool containing the word Essentials
is a tab-completion interface for winget itself. This is currently left out of
this module, but may be included in the future as an optional function to invoke,
in any case this is a trivial feature to add and is well-documented by Microsoft here:
Microsoft Learn: WinGet Tab Completion
Other code repositories provide suites of tab-completion support for various commands such as:



