functions/Install-PsModuleFast.ps1

Function Install-PsModuleFast {
    [CmdletBinding()]
    param([string] $module
        , [version] $version
        , [version] $MaxVersion
        , [version] $RequiredVersion
        , [string] $Repository)
    Write-Verbose "Loading module $Module"

    Repair-PSModulePath;
    
    $InstallmoduleArgs= @{}
    if ($Repository) {$InstallmoduleArgs.Add("Repository",$Repository)}

    $InstallmoduleVersionArgs = @{}
    if ($Version) {$InstallmoduleVersionArgs.Add("MinimumVersion",$Version)}
    if ($RequiredVersion) {$InstallmoduleVersionArgs.Add("RequiredVersion",$RequiredVersion)}
    if ($MaxVersion) {$InstallmoduleVersionArgs.Add("MaximumVersion",$MaxVersion)}
   
    if (Test-ShouldInstallModule -Module $Module @InstallmoduleVersionArgs) {
        Write-Output " Installing module $module"
        install-module $module -force -AllowClobber -Scope CurrentUser -SkipPublisherCheck @InstallmoduleArgs @InstallmoduleVersionArgs
    }

    $ImportmoduleArgs = @{}
    if ($Version) {$ImportmoduleArgs.Add("MinimumVersion",$Version)}
    if ($RequiredVersion) {$ImportmoduleArgs.Add("RequiredVersion",$RequiredVersion)}
    if ($MaxVersion) {$ImportmoduleArgs.Add("MaximumVersion",$MaxVersion)}
   
    if (Test-ShouldImportModule -module $module  @ImportmoduleArgs) {
        Write-Output " importing module $module $version"
            import-module $module -force  @ImportmoduleArgs
    }
}

function Test-ShouldInstallModule(){
    [CmdletBinding()]
    [OutputType([Boolean])]
    param($module
         ,[version]$RequiredVersion
         ,[version]$MaximumVersion
         ,[version]$MinimumVersion)
        
    $modulesInstalled = get-module $module -ListAvailable

    return Test-ShouldGetVersion -modules $modulesInstalled -RequiredVersion $RequiredVersion -MinimumVersion $MinimumVersion -MaximumVersion $MaximumVersion

    }
function Test-ShouldImportModule(){
    [CmdletBinding()]
    [OutputType([Boolean])]
    param($module
            ,[version]$RequiredVersion
            ,[version]$MaximumVersion
            ,[version]$MinimumVersion)
        
    $modulesLoaded = get-module $module 

    return Test-ShouldGetVersion -modules $modulesLoaded -RequiredVersion $RequiredVersion -MinimumVersion $MinimumVersion -MaximumVersion $MaximumVersion

    }

function Test-ShouldGetVersion(){
    [CmdletBinding()]
    [OutputType([Boolean])]
    param($modules
         ,[version]$RequiredVersion
         ,[version]$MaximumVersion
         ,[version]$MinimumVersion)

    if ($null -ne $RequiredVersion ){
        write-Verbose "Required version"
        if( -not ($modules.Version -eq $RequiredVersion)) {
        write-Verbose "Required version not found so have to install"
        return $true
    }
}
    if ($null -ne $MinimumVersion -and -not ($modules.Version -ge $MinimumVersion)) {
        write-Verbose "Minimum version not found so have to install"
        return $true
    }
    if ($null -ne $MaximumVersion -and -not ($modules.Version -le $MaximumVersion)) {
        write-Verbose "Maximum version modules found so have to install"
        return $true
    }
    if ($null -eq $modules ){
        write-Verbose "No modules found so have to install"
        return $true
    }
    write-Verbose "All tests passed don't install $($modules.Version)"
    return $false;

}


# Function Install-PsModuleFast {
# [CmdletBinding()]
# param([string] $module
# , [version] $version
# , [parameter(Mandatory=$false)][string] $path)
#
# Repair-PSModulePath;
#
# Write-Verbose "Loading module $Module"
# if (-not (get-module $(join-path $path $module) -ListAvailable | Where-object Version -ge $version)) {
# Write-Output " Installing module $module"
# if ($null -eq $version) {
# install-module $module -path $path -force -AllowClobber -Scope CurrentUser -SkipPublisherCheck
# }
# else {
# install-module $module -path $path -force -AllowClobber -Scope CurrentUser -SkipPublisherCheck -MinimumVersion $version
# }
# }
#
# if (-not (get-module $module | Where-object Version -GE $version)) {
# Write-Output " importing module $module $version"
# if ($null -eq $version ) {
# import-module $module -force
# }
# else {
# import-module $module -force -MinimumVersion $version
# }
# }
# }

function Repair-PSModulePath {

    if ($PSVersionTable.PsEdition -eq "Core"){
        $mydocsPath = "$([environment]::GetFolderPath("MyDocuments"))\PowerShell\Modules"
            }
        else{
            $mydocsPath = "$([environment]::GetFolderPath("MyDocuments"))\WindowsPowerShell\Modules"
        }

    If ("$($env:PSModulePath)".Split(";") -notcontains $mydocsPath) {
        $env:PSModulePath = "$mydocsPath;$($env:PSModulePath)"
        }
}

# $PSModules = @{Module = "Pester"; Version = "4.5" }, `
# @{Module = "Microsoft.PowerApps.PowerShell" }, `
# @{Module = "Microsoft.PowerApps.Administration.PowerShell" }, `
# @{Module = "VSSetup" }
# foreach ($Ps in $PSModules) {
#
# Install-PsModuleFast @PS
# }