Check-ModuleUpdate.ps1

#requires -version 5.1

<#PSScriptInfo
 
.VERSION 2.1.0
 
.GUID 7da2acc6-30d8-4cc9-a3d9-ba645fceebb2
 
.AUTHOR Jeff Hicks
 
.COMPANYNAME JDH Information Technology Solutions, Inc.
 
.COPYRIGHT (c) 2017-2021 JDH Information Technology Solutions, Inc.
 
.TAGS PowerShellget Module PSGallery
 
.LICENSEURI https://gist.github.com/jdhitsolutions/d97a81b86ca7a8f419f75acd33368ece
 
.PROJECTURI https://gist.github.com/jdhitsolutions/8a49a59c5dd19da9dde6051b3e58d2d0
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
This code is described at http://jdhitsolutions.com/blog/powershell/5441/check-for-module-updates/
 
#>


<#
.DESCRIPTION
 Check for module updates from the PowerShell gallery and create a comparison object.
 
#>


[cmdletbinding()]
[outputtype("moduleInfo")]
Param(
   [Parameter(Position = 0, HelpMessage = "Enter a module name or names. Wildcards are allowed.")]
   [ValidateNotNullorEmpty()]
   [string[]]$Name = "*"
)

Write-Verbose "Getting installed modules"
Try {
   $modules = Get-Module -Name $name -ListAvailable -ErrorAction Stop
}
Catch {
   Throw $_
}

if ($modules) {
   Write-Verbose "Found $($modules.count) matching modules"
   #group to identify modules with multiple versions installed
   Write-Verbose "Grouping modules"
   $g = $modules | Group-Object name -NoElement | Where-Object count -GT 1

   Write-Verbose "Filter to modules from the PSGallery"
   $gallery = $modules.where( { $_.repositorysourcelocation })

   Write-Verbose "Comparing to online versions"
   foreach ($module in $gallery) {

      #find the current version in the gallery
      Try {
         Write-Verbose "Looking online for $($module.name)"
         $online = Find-Module -Name $module.name -Repository PSGallery -ErrorAction Stop
         #compare versions
         if (($online.version -as [version]) -gt ($module.version -as [version])) {
            $UpdateAvailable = $True
         }
         else {
            $UpdateAvailable = $False
         }

         #write a custom object to the pipeline
         [pscustomobject]@{
            PSTypeName       = "moduleInfo"
            Name             = $module.name
            MultipleVersions = ($g.name -contains $module.name)
            InstalledVersion = $module.version
            OnlineVersion    = $online.version
            Update           = $UpdateAvailable
            Path             = $module.modulebase
         }
      }
      Catch {
         Write-Warning "Module $($module.name) was not found in the PSGallery"
      }

   } #foreach
}
else {
   Write-Warning "No matching modules found."
}

Write-Verbose "Check complete"