public/Update-Machine.ps1
function Update-Machine { <# .SYNOPSIS Run Windows system maintenance tasks .DESCRIPTION Run Windows system maintenance tasks suchas Windows Updates, updating Chocolatey and Winget packages, PowerShell modules, PowerShell help files and optionally display a confirmation toast popup. .PARAMETER WindowsUpdate Check for and install Windows updates .PARAMETER Chocolatey Update Chocolatey packages. If Chocolatey is installed. .PARAMETER Winget Update Winget packages. If Winget is installed. .PARAMETER Modules Update PowerShell modules. .PARAMETER Help Update PowerShell help files. If invoked without administrator context, this will only update help content under the CurrentUser scope (PS 6.1 or later) .PARAMETER ShowConfiration Display toast notification when complete. .PARAMETER Linux Optional. On Linux machines, invokes apt-get with update and full-upgrade options, as well as flatpak .EXAMPLE Update-Machine -WindowsUpdate .EXAMPLE Update-Machine -WindowsUpdate -Chocolatey -Winget -Modules -Help -ShowConfirmation .LINK https://github.com/Skatterbrainz/helium/blob/master/docs/Update-Machine.md #> [CmdletBinding()] param ( [parameter()][switch]$WindowsUpdate, [parameter()][switch]$Chocolatey, [parameter()][switch]$Winget, [parameter()][switch]$Modules, [parameter()][string]$ModuleNames = 'PowerShellAI,importexcel,carbon,dbatools,helium', [parameter()][switch]$Help, [parameter()][switch]$Linux, [parameter()][switch]$ShowConfirmation ) if ($PSVersionTable.Platform -ne 'Unix') { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 if ($Chocolatey) { if ($env:ChocolateyInstall) { Write-Host "Updating: Chocolatey packages" -ForegroundColor Cyan choco upgrade all -y } else { Write-Warning "Chocolatey is not installed" } } if ($Winget) { $wpath = "$env:LOCALAPPDATA\Microsoft\WindowsApps\winget.exe" if (Test-Path $wpath) { Write-Host "Updating: Winget packages" -ForegroundColor Cyan winget.exe upgrade --all --silent } else { Write-Warning "Winget is not installed" } } if ($WindowsUpdate) { if (Get-Module psWindowsUpdate -ListAvailable) { Write-Host "Checking for Windows updates..." -ForegroundColor Cyan Get-WindowsUpdate -AcceptAll -Install -WindowsUpdate -IgnoreReboot Get-WindowsUpdate -AcceptAll -Install -MicrosoftUpdate } else { Write-Warning "Module not installed: psWindowsUpdate" } } if ($Modules) { #Set-PSRepository -Name PGallery -InstallationPolicy Trusted if ((Get-PackageProvider -Name NuGet).Version -lt [version]::new("2.8.5.201")) { Write-Host "Updating package: NuGet" -ForegroundColor Cyan Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force } if ((Get-Module powershellget -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1).Version -lt [version]::new("2.2.5")) { Write-Host "Updating module: PowerShellGet" -ForegroundColor Cyan Update-Module PowerShellGet -Force } if ($ModuleNames -ne "All") { $ModuleNames.Split(',') | Foreach-Object { if (Get-Module $_ -ListAvailable) { Write-Host "Updating module: $($_)" -ForegroundColor Cyan Update-Module $_ } else { Write-Host "Module not installed: $($_)" -ForegroundColor Magenta } } } else { Get-Module -ListAvailable | Select-Object -ExpandProperty Name | Foreach-Object { Write-Host "Updating module: $($_)" -ForegroundColor Cyan $res = Update-Module $_ -ErrorAction SilentlyContinue -PassThru $res | Select-Object Name,Version } } } if ($Help) { if (Test-IsAdmin) { if ($PSVersionTable.PSVersion -ge 6.1) { Write-Host "Updating PS Help: All Users scope" Update-Help -Scope AllUsers -ErrorAction SilentlyContinue } else { Write-Host "Updating PS Help" Update-Help -ErrorAction SilentlyContinue } } else { if ($PSVersionTable.PSVersion -ge 6.1) { Write-Host "Updating PS Help: Current User scope only" Update-Help -Scope CurrentUser -ErrorAction SilentlyContinue } else { Write-Host "Updating PS Help" Update-Help -ErrorAction SilentlyContinue } } } if ($ShowConfirmation) { $params = @{ Text = "Computer maintenance completed!" Sound = "Mail" SnoozeAndDismiss = $True } if (Test-Path "c:\temp\customimage.png") { $params['AppLogo'] = "c:\temp\customimage.png" } New-BurntToastNotification @params } } else { sudo apt-get update sudo apt-get full-upgrade -y # or safe-upgrade -y flatpak update if ($Modules) { #Set-PSRepository -Name PGallery -InstallationPolicy Trusted if ((Get-PackageProvider -Name NuGet).Version -lt [version]::new("2.8.5.201")) { Write-Host "Updating package: NuGet" -ForegroundColor Cyan Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force } if ((Get-Module powershellget -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1).Version -lt [version]::new("2.2.5")) { Write-Host "Updating module: PowerShellGet" -ForegroundColor Cyan Update-Module PowerShellGet -Force } if ($ModuleNames -ne "All") { $ModuleNames.Split(',') | Foreach-Object { if (Get-Module $_ -ListAvailable) { Write-Host "Updating module: $($_)" -ForegroundColor Cyan Update-Module $_ } else { Write-Host "Module not installed: $($_)" -ForegroundColor Magenta } } } else { Get-Module -ListAvailable | Select-Object -ExpandProperty Name | Foreach-Object { Write-Host "Updating module: $($_)" -ForegroundColor Cyan $res = Update-Module $_ -ErrorAction SilentlyContinue -PassThru $res | Select-Object Name,Version } } } if ($Help) { if (Test-IsAdmin) { if ($PSVersionTable.PSVersion -ge 6.1) { Write-Host "Updating PS Help: All Users scope" Update-Help -Scope AllUsers -ErrorAction SilentlyContinue } else { Write-Host "Updating PS Help" Update-Help -ErrorAction SilentlyContinue } } else { if ($PSVersionTable.PSVersion -ge 6.1) { Write-Host "Updating PS Help: Current User scope only" Update-Help -Scope CurrentUser -ErrorAction SilentlyContinue } else { Write-Host "Updating PS Help" Update-Help -ErrorAction SilentlyContinue } } } } Write-Output 0 } |