Communary.MUC.psm1

function Find-ModuleUpdates {

    Get-Module -ListAvailable -Verbose:$false | Group-Object -Property Name | ForEach-Object {

        $installedModule = $_.Group | Sort-Object -Property Version -Descending | Select-Object -First 1
        $onlineModule = Find-Module -Name $installedModule.Name -Verbose:$false -ErrorAction SilentlyContinue

        if ($onlineModule) {

            $onlineVersion = $onlineModule.Version
            $installedVersion = $installedModule.Version

            if ($onlineVersion -gt $installedVersion) {

                Write-Output ([PSCustomObject] [Ordered] @{
                    Name = $onlineModule.Name
                    InstalledVersion = $installedVersion
                    OnlineVersion = $onlineVersion
                })
            }
        }
    }
}

function Save-ModuleUpdates {
    $updatesPath = Join-Path $env:HOMEDRIVE (Join-Path $env:HOMEPATH 'availableModuleUpdates.xml')
    Find-ModuleUpdates | Export-Clixml -Path $updatesPath -Force
}

function Get-ModuleUpdates {
    $updatesPath = Join-Path $env:HOMEDRIVE (Join-Path $env:HOMEPATH 'availableModuleUpdates.xml')
    if (Test-Path -Path $updatesPath) {
        Import-Clixml -Path $updatesPath
    }
}

function Install-ModuleUpdatesCheck {

    $taskName = 'ModuleUpdatesCheck'

    if (-not (Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue)) {
        try {
            $taskAction = New-ScheduledTaskAction -Argument '-noprofile -command "& {Save-ModuleUpdates}' -Execute 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
            $taskTrigger = New-ScheduledTaskTrigger -AtLogOn -RandomDelay (New-TimeSpan -Minutes 15)
            $taskSettings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Hours 1)
            $taskPrincipal = New-ScheduledTaskPrincipal -GroupId "BUILTIN\Administrators" -RunLevel Highest
            $scheduledTask = New-ScheduledTask -Action $taskAction -Principal $taskPrincipal -Trigger $taskTrigger -Settings $taskSettings -Description "Module Updates Check"
            Register-ScheduledTask -TaskName $taskName -TaskPath '\' -InputObject $scheduledTask -Force
        }
        catch {
            Write-Warning -Message $_.Exception.Message
        }
    }

    else {
        Write-Host 'Task already installed.'
    }
}