Load-PowershellModule.ps1
|
<#PSScriptInfo
.VERSION 1.0.0 .GUID 3de72100-8802-407c-aaf9-0e58471b93d2 .AUTHOR Tristan Barcelon .DESCRIPTION Load a powershell module using the specified ModuleName and Version with optional Repository and PSCredential parameters. .COMPANYNAME .COPYRIGHT .TAGS Powershell 5.1 .LICENSEURI .PROJECTURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> Function Load-PowershellModule { <# .SYNOPSIS Load a powershell module using the specified ModuleName and Version, to aid in loading a module only one time for re-use within the current session. .DESCRIPTION This cmdlet will check if the powershell module using the specified ModuleName and Version has already been loaded in the current session. If not, it will perform secondary and ternary searches locally and from the specified Repository. When a match is found, it will also install and load into current session. When all levels of search do not return a match, it will return false. This is an enhanced version of the Get-MyModule function provided here: https://blogs.technet.microsoft.com/heyscriptingguy/2010/07/11/hey-scripting-guy-weekend-scripter-checking-for-module-dependencies-in-windows-powershell/ .PARAMETER ModuleName Powershell module name you want to load .PARAMETER MongoDBPort Version of the powershell module you want to load .PARAMETER Repository Optional powershell repository name to consult when performing a module search .PARAMETER Credential Optional powershell credentiall object needed for private powershell repositories .EXAMPLE Load-PowershellModule -ModuleName 'Module' -Version '1.0.0' .EXAMPLE Load-PowershellModule -ModuleName 'PublicModule' -Version '1.0.0' -Repository PSGallery .EXAMPLE Load-PowershellModule -ModuleName 'PrivateModule' -Version '1.0.0' -Repository PrivateGallery -Credential $PSCredential #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseApprovedVerbs', '')] [OutputType([bool])] param ( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $ModuleName, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Version, [Parameter(Mandatory=$false)] [string] $Repository = $null, [Parameter(Mandatory=$false)] [PSCredential] $Credential = $null ) Set-StrictMode -Version 'Latest' try { if (-not (Get-Module -name $ModuleName -Verbose:$false)) { if ( Get-Module -ListAvailable -Verbose:$false | Where-Object { $_.name -eq $ModuleName -and $_.Version -eq $Version } ) { Write-Verbose -Message ('Found module: {0} with version: {1} locally. Attempting to load now.' -f $ModuleName, $Version) Import-Module -Name $ModuleName -RequiredVersion $Version -Verbose:$false Write-Verbose -Message ('Successfully loaded module: {0} with version: {1}.' -f $ModuleName, $Version) return $true } #end if module available then import else { Write-Verbose -Message ('Module: {0} with version: {1} was not found locally.' -f $ModuleName, $Version) if ($Repository -ne $null) { if (-not($PSVersionTable.PSVersion.Major -eq 5 -and $PSVersionTable.PSVersion.Minor -eq 1) -and $Credential -ne $null) { Write-Verbose -Message ('Installed version of powershell is: {0} but {1} or greater is required.' -f $PSVersionTable.PSVersion.ToString(), '5.1') return $false } if ($Credential -ne $null) { Write-Verbose -Message ('Searching for module: {0} with version: {1} on private repository: {2}.' -f $ModuleName, $Version, $Repository) $requiredModule = Find-Module -Name $ModuleName -Repository $Repository -RequiredVersion $Version -Credential $Credential } else { Write-Verbose -Message ('Searching for module: {0} with version: {1} on public repository: {2} using credential.' -f $ModuleName, $Version, $Repository) $requiredModule = Find-Module -Name $ModuleName -Repository $Repository -RequiredVersion $Version } if ($requiredModule -eq $null) { Write-Verbose -Message ('Unable to find module: {0} with version: {1} in repository: {2}.' -f $ModuleName, $Version, $Repository) return $false } else { Write-Verbose -Message ('Installing module: {0} with version: {1} from repository: {2}.' -f $ModuleName, $Version, $Repository) Install-Module -Name $ModuleName -Repository $Repository -RequiredVersion $Version -Credential $Credential -Force -AllowClobber Write-Verbose -Message ('Attempting to load module: {0} with version: {1}.' -f $ModuleName, $Version) Import-Module -Name $ModuleName -RequiredVersion $Version -Verbose:$false Write-Verbose -Message ('Successfully loaded module: {0} with version: {1}.' -f $ModuleName, $Version) return $true } } else { Write-Verbose -Message ('Unable to find module: {0} with version {1} locally and no repository was provided.' -f $ModuleName, $Version) return $false } } #module not available } # end if not module else { Write-Verbose -Message ('Module: {0} with version: {1} is already loaded in current session.' -f $ModuleName, $Version) return $true } #module already loaded } catch { $ErrorMessage = $_.Exception.Message Write-Verbose -Message ('An error was encountered: {0}.' -f $ErrorMessage) throw } } |