Public/Import-SpecPowerShellModule.ps1

Function Import-SpecPowerShellModule {
    <#
    .SYNOPSIS
    Imports a PowerShell module.
 
    .DESCRIPTION
    The Import-SpecPowerShellModule function imports a PowerShell module by name. It unloads any existing module with the same name and then imports the specified module.
 
    .PARAMETER Module
    The name of the module to import. This parameter accepts pipeline input.
 
    .INPUTS
    System.String
 
    .OUTPUTS
    None
 
    .EXAMPLE
    Import-SpecPowerShellModule -Module 'MyModule'
 
    Imports the 'MyModule' PowerShell module.
 
    .EXAMPLE
    'Module1', 'Module2' | Import-SpecPowerShellModule
 
    Imports the 'Module1' and 'Module2' PowerShell modules using pipeline input.
 
    .NOTES
    - If the module is already imported, it is first removed and then re-imported to ensure a fresh import.
    - If an error occurs during the import process, an error message is displayed, and the function exits with a status code of 500.
 
    Author: owen.heaume
    Company: Specsavers
    Version: - 1.0
             - 1.1 Multiple bugfixes picked up by Pester tests eg - did not support pipeline input correctly
    #>


    [cmdletbinding()]

    param (
        [parameter(Mandatory = $true, Position = 1, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [string]$Module,

        [string]$RequiredVersion
    )
    process {
        $VerboseSwitch = $VerbosePreference

        foreach ($m in $Module) {
            #write-host "`n"
            $importedModules = Get-Module -Name $m #-ErrorAction SilentlyContinue
            $version = $importedModules.Version


            if ($importedModules) {
                Write-Verbose "The module '$m' is already imported."
                $imported = $true
            } else {
                Write-verbose "The module '$m' is not already imported."
                $imported = $false
            }

            # Attempt to import module
            try {
                # Unload any existing module if loaded already
                if ($imported) {
                    write-verbose "Unloading $Module..."
                    $VerbosePreference = 'SilentlyContinue'
                    Remove-Module $M -Verbose:$false -Force -ErrorAction SilentlyContinue
                    $VerbosePreference = 'Continue'
                }


                if ($RequiredVersion -eq "" -or $RequiredVersion -eq $null) {
                    write-verbose "Importing module $m"
                    $VerbosePreference = 'SilentlyContinue'
                    Import-Module $M -Force -Verbose:$false -ErrorAction stop
                } else {
                    $VerbosePreference = 'SilentlyContinue'
                    write-verbose "Importing module version: $RequiredVersion..."
                    Import-Module $M -force -RequiredVersion $RequiredVersion -Verbose:$false -ErrorAction stop
                }
            } catch [System.Exception] {
                Write-Error "ERROR - unable to import the $M module"
                Exit 500
            }

            $VerbosePreference = $VerboseSwitch

            Write-Verbose "Import of Module was successful`n"
        }
    }
}