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
    }
}