Public/Resolve-Module.ps1
using namespace System using namespace System.IO using namespace System.Management.Automation function Resolve-Module { # .DESCRIPTION # Gets latest module version from PSGallery and installs the update if local module is out of date. [CmdletBinding()][OutputType([Object[]], [IO.FileInfo[]])] param ( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [Alias('n', 'Name')] [string[]]$Names, [Parameter(Mandatory = $false)] [Alias('u')] [switch]$UpdateModule, [Parameter(Mandatory = $false)] [Alias('ro')] [switch]$removeold ) begin { [bool]$useverbose = $PSCmdlet.MyInvocation.BoundParameters['verbose'] -eq $true [bool]$useforce = $PSCmdlet.MyInvocation.BoundParameters['Force'] -eq $true $res = @() } process { foreach ($moduleName in $Names) { Write-Host "`nResolve: Module [$moduleName]" -f Magenta $Local_ModuleVersion = Get-LatestModuleVersion -Name $moduleName -Source LocalMachine $Latest_ModuleVerion = Get-LatestModuleVersion -Name $moduleName -Source PsGallery -ErrorAction Ignore if (!$Latest_ModuleVerion -or $Latest_ModuleVerion -eq ([version]::New())) { $Error_params = @{ ExceptionName = 'System.Data.OperationAbortedException' ExceptionMessage = "ResolveModule.Get-LatestModuleVersion: Failed to find latest module version for '$moduleName'." ErrorId = 'CouldNotFindModule' Caller = $PSCmdlet ErrorCategory = 'OperationStoped' } Write-TerminatingError @Error_params } if (!$Local_ModuleVersion -or $Local_ModuleVersion -eq ([version]::New())) { Write-Verbose -Message "Install $moduleName ..." $res += [Pscraft]::InstallPsGalleryModule($moduleName) } elseif ($Local_ModuleVersion -lt $Latest_ModuleVerion -and $UpdateModule.IsPresent) { Write-Verbose -Message "Update $moduleName from version $Local_ModuleVersion to version [$Latest_ModuleVerion] ..." -Verbose $res += [Pscraft]::InstallPsGalleryModule($moduleName, $Latest_ModuleVerion, $true) } else { Write-Host "Resolve: Module $moduleName is already Installed and Up-to-date." -f Green } if ($removeold.IsPresent) { # TODO: remove duplicates and old versions using Clear-ModuleVersions if (![Pscraft]::removeold($moduleName)) { Write-Error -Exception System.Management.Automation.ItemNotFoundException -Message "Can't find Module $moduleName" -ErrorId "ModuleNotFound" -Category "ObjectNotFound" } } Write-Verbose -Message "Importing module $moduleName ..." (Find-InstalledModule $moduleName).Path | Import-Module -Verbose:$useverbose -Force:$useforce } } end { return $res } } |