Powershell Modules detecteren en installeren

Om in powershell scripts de juiste modules te laden gebruik ik een module.ps1 bestand, deze bevat alle relevante modules die ik gebruik tijdens uitvoeren van een script. Het module.ps1 bestand wordt aan het uit te voeren script toegevoegd door een include regel:

. $PSScriptRoot\modules.ps1

Onderstaand is een subset van de door mij gebruikte modules, een functie wordt geinstalleerd door de functie met juiste parameters aan te roepen in het hoofdscript.
In onderstaand voorbeeld laad ik in mijn module.ps1 direct een aantal modules, ook zit hier maatwerk in voor bijvoorbeeld de VMWare powerCLI en Xen (Xen vereist een zip bestand met de module in de root folder van het script / module.

######################################################################################
#
# MODULES DETECTEREN / INSTALLEREN
#
######################################################################################
function InstallModules
(
    [string]$modulename,
    [string]$moduledisplay
) {
    write-host "######################################################################################" -ForegroundColor Magenta
    write-host "############### $moduledisplay" -ForegroundColor Magenta
    if (!(get-installedmodule $modulename)) { 
        install-module $modulename -SkipPublisherCheck -Confirm:$False -Force -allowclobber
        Import-Module $modulename -force
    } 
    else { 
        Import-Module $modulename -Force
        write-host "############### $moduledisplay " -ForegroundColor Green
    }
}
InstallModules -modulename SQLServer -moduledisplay "SQL Server"
InstallModules -modulename azure.storage -moduledisplay "Azure Storage"

# Maatwerk Modules #
# Power CLI #
write-host "######################################################################################" -ForegroundColor Magenta
write-host "############### VMware PowerCLI" -ForegroundColor Magenta
if (!(get-installedmodule vmware.powercli)) { 
    install-module vmware.powercli -Confirm:$False -Force -AllowClobber
    import-module vmware.powercli -Force
    Set-PowerCLIConfiguration -Scope User -ParticipateInCEIP $false | out-null
} 
else { 
    $lvermajor = (get-installedmodule vmware.powercli).version.major
    $lverminor = (get-installedmodule vmware.powercli).version.minor
    $lverbuild = (get-installedmodule vmware.powercli).version.build
    $lverrevision = (get-installedmodule vmware.powercli).version.revision
    write-host "############### VMware PowerCLI versie lokaal : $lvermajor.$lverminor.$lverbuild.$lverrevision" -ForegroundColor Cyan
    $overmajor = (find-module vmware.powercli).version.major
    $overminor = (find-module vmware.powercli).version.minor
    $overbuild = (find-module vmware.powercli).version.build
    $overrevision = (find-module vmware.powercli).version.revision
    write-host "############### VMware PowerCLI versie online : $overmajor.$overminor.$overbuild.$overrevision" -ForegroundColor Cyan
    if ($lvermajor -clt $overmajor) { write-host "############### VMware PowerCLI Major versie wijkt af $lvermajor <> $overmajor"; install-module vmware.powercli -Confirm:$False -Force -AllowClobber }
    if ($lverminor -clt $overminor) { write-host "############### VMware PowerCLI Minor versie wijkt af $lverminor <> $overminor"; install-module vmware.powercli -Confirm:$False -Force -AllowClobber }
    if ($lverbuild -clt $overbuild) { write-host "############### VMware PowerCLI Build versie wijkt af $lverbuild <> $overbuild"; install-module vmware.powercli -Confirm:$False -Force -AllowClobber }
    if ($lverrevision -clt $overrevision) { write-host "############### VMware PowerCLI revision versie wijkt af $lverrevision <> $overrevision"; install-module vmware.powercli -Confirm:$False -Force -AllowClobber }
    import-module vmware.powercli -Force
    Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false | out-null
    write-host "############### VMware PowerCLI " -ForegroundColor Green
}
# RSAT Tools 
write-host "######################################################################################" -ForegroundColor Magenta
Write-host "############### RSAT Active Directory " -ForegroundColor Magenta
if ((Get-WindowsFeature RSAT-AD-Powershell).installed -eq $False) { 
    Import-Module ServerManager
    Add-WindowsFeature RSAT-AD-PowerShell -Confirm:$false
    Import-Module ActiveDirectory 
} 
else { 
    Import-Module ActiveDirectory
    write-host "############### RSAT Active Directory" -ForegroundColor Green
}
# Xen Server
write-host "######################################################################################" -ForegroundColor Magenta 
Write-host "############### Xen Server Module " -ForegroundColor Magenta
if (!(test-path -Path $PSScriptRoot\XenServerPSModule)) {
    New-Item -Path $PSScriptRoot\XenServerPSModule -ItemType Directory -Force
    Expand-Archive -Path $PSScriptRoot\XenServerPSModule.zip -DestinationPath $PSScriptRoot
    copy-item "$PSScriptRoot\XenServerPSModule\*" -destination "$env:windir\system32\WindowsPowerShell\v1.0\Modules\XenServerPSModule" -recurse 
} 
else {
    Import-Module $PSScriptRoot\XenServerPSModule\XenServerPSModule.psd1
    write-host "############### XenServer Module" -ForegroundColor Green
}