PSUtilities.psm1

Function Update-LocalModules
{
Param (
[switch]$RemoveOld
)

$Startscript = Get-Date
Start-Transcript -Path .\UpdateModules$("{0:yyMMddHHmm}"-f (get-date)).log -Force
<#
.DESCRIPTION
   This Function updates local PowerShell modules with the last version online
   and deletes all the older local versions
   It registers all the activity in .\UpdateModules.log
.PARAMETER RemoveOld
   This switch parameter removes the outdated local modules from disk
 
#>



#Checks Internet Conectivity
if (-not(
[Activator]::CreateInstance([Type]::GetTypeFromCLSID([Guid]'{DCB00C01-570F-4A9B-8D69-199FDBA5723B}')).IsConnectedToInternet
)){Throw "The machine needs to be connected to the internet"}


Write-Host "Checking online modules..."
$OnlineModules = Find-Module
$CurrentFreespace = [math]::Round( (Get-Ciminstance -ClassName win32_logicaldisk | Where DeviceId -eq "C:").FreeSpace / 1mb,2)

#Gets current latest module version installed
Write-Host "Looking for Installed Modules..." -Foregroundcolor Green
$Latest = Get-InstalledModule 

foreach ($module in $Latest) {
 
 #Local module is also online, shows the two versions
    if ($module.name -in ($OnlineModules).name) {
        $OnlineModule = $OnlineModules | where name -EQ $module.name
        Write-Host "`nOnline module: " -ForegroundColor Green -NoNewline
        Write-Host "$(($OnlineModule).Version) $($OnlineModule.name)" -ForegroundColor Green -NoNewline
        Write-Host " (Published on $("{0:dd/MM/yyyy}" -f $OnlineModule.PublishedDate) - $(((Get-Date) - $OnlineModule.PublishedDate).Days) Days ago)" -ForegroundColor Gray
        Write-Host "Local Module: " -ForegroundColor Gray -NoNewline
        write-host "$(($module).Version) $($module.name)" -ForegroundColor Gray -NoNewline
     
    if ($module.Version -lt $OnlineModule.Version) {
    Write-Host "`nLocal version outdated, installing new online version... " -ForegroundColor Yellow -NoNewline
    Write-Host "$(($OnlineModule).Version) $($OnlineModule.name)" -ForegroundColor Green
    Install-Module -Name $OnlineModule.name -Force
    $module.version = $OnlineModule.Version
    }
    else {Write-Host " Ok" -ForegroundColor White}

    }
#Removes the older versions if parameter -RemoveOld has been specified
if ($RemoveOld)
    { 
    $Oldlocalmodules = Get-InstalledModule $module.Name -AllVersions | Where-Object {$_.Version -ne $module.Version}
    if ($Oldlocalmodules -ne $null) 
    {Write-Host "Old modules found. Unninstalling older modules..." -ForegroundColor Gray; $Oldlocalmodules | Uninstall-Module -Force -Verbose }
    }

}

if ($RemoveOld)
    {
    $CleanedFreespace = [math]::Round( (Get-Ciminstance -ClassName win32_logicaldisk | Where DeviceId -eq "C:").FreeSpace / 1mb,2)
    $Freedspace = $CleanedFreespace - $CurrentFreespace
    Write-Host "`nFreed Space in C: $([math]::round($Freedspace,2)) MB" -ForegroundColor Green
    Write-Host "Current Space in C: $([math]::round($CleanedFreespace,2)) MB" -ForegroundColor Green
    }
Write-Host "Time elapsed: $(((Get-Date) - $Startscript).Minutes) Minute(s)" -ForegroundColor Green
Stop-Transcript
}

Export-ModuleMember -Function Update-LocalModules