Menu Close

Update all PowerShell modules on a system

If you are using PowerShell, you probably use some modules from the PowerShell Gallery. These modules are created by Microsoft or by third party companies, but most of them are open source and created by the community. In all cases, chances are the module gets regular updates. This could be to fix bugs, add new functionality or make changes needed for the technology the module works with. This is often good news, but it does mean that you need to manually update every module. As that takes time, I have made a script that can update all PowerShell modules on a system.

What does the script do

I have created this script years ago with my colleague Gerbrand. Recently I have updated the script and made it more flexible for everyone to use.

The script goes through all installed PowerShell modules on the system.
For each module, it checks if a new version is available in the PowerShell Gallery. If there is, it installs the update.

After that, it will remove the old versions of the module, as that is not something that the system does automatically.

Options

I have created some parameters to help this script fit your personal needs:

ExcludedModules

If there are modules you don’t want to include in the automatic update, you can add them to this parameter.

SkipMajorVersion

A major update is an update where the first number of the version is changed. This means that breaking changes can be involved. By using this parameter the script will not perform an automatic update when a major change is involved. To learn more about semantic versioning, click here.

KeepOldModuleVersions

You can use this switch to stop the script from removing the old module versions.

ExcludedModulesforRemoval

In this parameter you can define modules where you don’t want to automatically remove the old version. I added Az as a default option in here, as I have found the module to sometimes get instable after an old version is removed.

How to run

I run the script manually about once a week. I have made a part of a personal module that I import, but you can also do it with dot sourcing. After it is loaded, you can run the Update-EveryModule cmdlet. But of course the better solution is to automated it completely! You can do that with a schedule task for example. In this post, I show how you can make one with PowerShell.

If you want to automatically update all modules in an Azure Automation account, you can do so by using the script I wrote about here.

The script

You can find the script here

Conclusion

So this is how you can update all PowerShell modules on a system. If you have any questions, leave them in the comments!

11 Comments

  1. Michel

    * Doesn’t handle preview or nightly build modules well (eg PnP.PowerShell)
    * There are official (test/preview) modules coming from other repos (eg. poshtestgallery.com)
    * When updating, you might want to specify the same source repo as the one from the module you’re updating
    * Before uninstalling, you might want to unload (remove) the module
    * For proper version comparisons, might want to use the [System.Version] class; text-oriented version comparison leads to 9.1 being bigger than 10.0 for example.

    I have a ‘connect’ script for M365 services where I had to deal with the same issues.

  2. issam seghir

    You can update all module in one command in PowerShell
    just make sure the repo is trusted to avoid “Untrusted repository question” in every module updated
    Set-PSRepository -Name “repo-name” -InstallationPolicy Trusted

    If you install the modules from PSGallery repo use :
    Set-PSRepository -Name “PSGallery” -InstallationPolicy Trusted

    then use this command to update all module :
    Get-InstalledModule | Update-Module -WhatIf -AcceptLicense
    Note :
    -WhatIf : optionall
    -AcceptLicense : optionall

    • Barbara

      That would certainly work! This script offers extra functionality, like logs, skipping majorversions and removing old module versions.

  3. zack

    Why do people write big long complicated scripts to do what can be done in a 1-liner… :

    get-installedmodule | update-module -force

    …and done.

  4. Tim Cartwright

    Barbara, really liked your script. Made some alterations that you and others might like:

    https://gist.github.com/tcartwright/615053acde5ea64d1664ef6f9faa6524

    TIM C: Changes:
    – Added scope parameter so scope could be controlled
    – altered code to always check for old versions, as this script may not have done the install, but it can still remove old versions
    – changed contains and othercomparison syntax to be case insensitive
    – altered logic around when the module is not found in the gallery to make the verbose output clearer
    – added version parses around the version compares so string comparisons do not screw up the comparison
    – added admin check when using AllUsers
    – added output object that can be queried / reported on with changes
    – added switch to allow for pre-release versions
    – added a progressbar
    – added a check for admin, and relaunch into admin if not in admin

Leave a Reply

Your email address will not be published. Required fields are marked *