[CmdletBinding()] param ( [Parameter()] # To exclude modules from the update process [String[]]$ExcludedModules, # To include only these modules for the update process [String[]]$IncludedModules, [switch]$SkipPublisherCheck, [switch]$SimulationMode ) [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12 # if needed, register PSGallery # Register PSGallery PSprovider and set as Trusted source # Register-PSRepository -Default -ErrorAction SilentlyContinue # Set-PSRepository -Name PSGallery -InstallationPolicy trusted -ErrorAction SilentlyContinue ## Fragt nach Admin Rechten. if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { $arguments = "& '" + $myinvocation.mycommand.definition + "'" Start-Process powershell -Verb runAs -ArgumentList $arguments Break } # Konfig für die prompts $choices = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription] $choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Yes')) $choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&No')) ## Konfig für die Software $toRemove = @('Clipchamp.Clipchamp_yxz26nhyzhsrt', 'Microsoft.549981C3F5F10_8wekyb3d8bbwe', 'Microsoft.BingNews_8wekyb3d8bbwe', 'Microsoft.BingWeather_8wekyb3d8bbwe', 'Microsoft.GetHelp_8wekyb3d8bbwe', 'Microsoft.MicrosoftOfficeHub_8wekyb3d8bbwe', 'Microsoft.MicrosoftSolitaireCollection_8wekyb3d8bbwe', 'Micorosoft.MicrosoftStickyNotes_8wekyb3d8bbwe', 'Microsoft.People_8wekyb3d8bbwe', 'Microsoft.PowerAutomateDesktop_8wekyb3d8bbwe', 'Microsoft.Todos_8wekyb3d8bbwe', 'Microsoft.Windows.Photos_8wekyb3d8bbwe', 'Microsoft.WindowsMaps_8wekyb3d8bbwe', 'Microsoft.WindowsSoundRecorder_8wekyb3d8bbwe', 'Microsoft.WindowsAlarms_8wekyb3d8bbwe', 'Microsoft.YourPhone_8wekyb3d8bbwe', 'Microsoft.ZuneMusic_8wekyb3d8bbwe', 'Microsoft.ZuneVideo_8wekyb3d8bbwe', 'MicrosoftCorporationII.QuickAssist_8wekyb3d8bbwe', 'MicrosoftTeams_8wekyb3d8bbwe', 'MicrosoftTeams_8wekyb3d8bbwe', 'Microsoft.OneDrive', 'microsoft.windowscommunicationsapps_8wekyb3d8bbwe') $toInstall = @('mcmilk.7zip-zstd', 'VideoLAN.VLC','SumatraPDF.SumatraPDF','Microsoft.VisualStudioCode','Bitwarden.Bitwarden','Mozilla.Firefox','IrfanSkiljan.IrfanView','Microsoft.PowerToys','OO-Software.ShutUp10' ,'Joplin.Joplin','WireGuard.WireGuard','Devolutions.RemoteDesktopManager','TeamViewer.TeamViewer') $toInstallOpt = @('Element.Element','CPUID.CPU-Z','Discord.Discord','Corsair.iCUE.4','Valve.Steam','GOG.Galaxy') function Show-Menu { param ( [string]$Title = 'Software installation' ) Clear-Host Write-Host "================ $Title ================" Write-Host "1: Remove unwanted" Write-Host "2: Installiere Software" Write-Host "3: Installiere optionale Software" Write-Host "4: Konfiguriere Windows" Write-Host "5: Update System" Write-Host "Q: Beenden" } do { Show-Menu $selection = Read-Host "Bitte Aufgabe auswählen" switch ($selection) { '1' { foreach ($utility in $toRemove) { winget uninstall --id $utility } } '2' { foreach ($utility in $toInstall) { $ergebnis = winget list --id $utility if ($ergebnis -eq "Es wurde kein installiertes Paket gefunden, das den Eingabekriterien entspricht.") { winget install -e --id $utility --silent } else { Write-Host "Programm $utility bereits installiert" } } Start-Process OOSU10 -NoNewWindow -Wait } '3' { foreach ($utility in $toInstallOpt) { $ergebnis = winget list --id $utility if ($ergebnis -eq "Es wurde kein installiertes Paket gefunden, das den Eingabekriterien entspricht.") { $decision = $Host.UI.PromptForChoice("$utility", "Soll $utility installiert werden?" , $choices, 1) if ($decision -eq 0) { Write-Host "Installiere $utility" winget install -e --id $utility --silent } } } $decision = $Host.UI.PromptForChoice('WSL', 'Soll WSL mit Debian 11 installiert werden?' , $choices, 1) if ($decision -eq 0) { Write-Host "Installiere WSL" wsl --install Write-Host "Installiere Debian" wsl --install -d Debian } } '4' { $decision = $Host.UI.PromptForChoice('Explorer', 'Soll das Kontextmenü von Windows 10 wiederhergestellt werden?' , $choices, 1) if ($decision -eq 0) { New-Item -Path "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" -Value "" -Force Set-Itemproperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name 'Hidden' -value '00000001' Set-Itemproperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced' -Name 'HideFileExt' -value '00000000' Set-Itemproperty -path 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CabinetState' -Name 'FullPath' -value '00000001' Write-Host "Starte Explorer neu um änderungen zu übernehmen" Get-Process explorer | Stop-Process } if (!(Get-Module -ListAvailable -Name PSWindowsUpdate)) { $decision = $Host.UI.PromptForChoice('Updates', 'Soll das Powershell Modul zum updaten von Windows installiert werden?' , $choices, 1) if ($decision -eq 0) { Install-Module -Name PSWindowsUpdate -Force } } } '5' { Write-Host "Beginne mit dem Update aller Pakete..." winget upgrade --all --accept-package-agreements --accept-source-agreements if (Get-Module -ListAvailable -Name PSWindowsUpdate) { Write-Host "Installiere Windows Updates..." Install-WindowsUpdate -MicrosoftUpdate -AcceptAll -IgnoreReboot Write-Host "Update aller Powershell Module..." if ($SimulationMode) { Write-Host -ForegroundColor yellow 'Simulation mode is ON, nothing will be installed / removed / updated' } Write-Host -ForegroundColor Cyan 'Get all PowerShell modules' function Remove-OldPowerShellModules { param ( [string]$ModuleName, [string]$GalleryVersion ) try { $oldVersions = Get-InstalledModule -Name $ModuleName -AllVersions -ErrorAction Stop | Where-Object { $_.Version -ne $GalleryVersion } foreach ($oldVersion in $oldVersions) { Write-Host -ForegroundColor Cyan "$ModuleName - Uninstall previous version ($($oldVersion.Version))" if (-not($SimulationMode)) { Remove-Module $ModuleName -ErrorAction SilentlyContinue Uninstall-Module $oldVersion -Force -ErrorAction Stop } } } catch { Write-Warning "$module - $($_.Exception.Message)" } } if ($IncludedModules) { $modules = Get-InstalledModule | Where-Object { $IncludedModules -contains $_.Name } } else { $modules = Get-InstalledModule } foreach ($module in $modules.Name) { if ($ExcludedModules -contains $module) { Write-Host -ForegroundColor Yellow "Module $module is excluded from the update process" continue } elseif ($module -like "$excludedModules") { Write-Host -ForegroundColor Yellow "Module $module is excluded from the update process (match $excludeModules)" continue } $currentVersion = $null try { $currentVersion = (Get-InstalledModule -Name $module -AllVersions -ErrorAction Stop).Version } catch { Write-Warning "$module - $($_.Exception.Message)" continue } try { $moduleGalleryInfo = Find-Module -Name $module -ErrorAction Stop } catch { Write-Warning "$module not found in the PowerShell Gallery. $($_.Exception.Message)" } if ($null -eq $currentVersion) { Write-Host -ForegroundColor Cyan "$module - Install from PowerShellGallery version $($moduleGalleryInfo.Version) - Release date: $($moduleGalleryInfo.PublishedDate)" if (-not($SimulationMode)) { try { Install-Module -Name $module -Force -SkipPublisherCheck -ErrorAction Stop } catch { Write-Warning "$module - $($_.Exception.Message)" } } } elseif ($moduleGalleryInfo.Version -eq $currentVersion) { Write-Host -ForegroundColor Green "$module already in latest version: $currentVersion - Release date: $($moduleGalleryInfo.PublishedDate)" } elseif ($currentVersion.count -gt 1) { Write-Host -ForegroundColor Yellow "$module is installed in $($currentVersion.count) versions (versions: $($currentVersion -join ' | '))" Write-Host -ForegroundColor Cyan "$module - Uninstall previous $module version(s) below the latest version ($($moduleGalleryInfo.Version))" Remove-OldPowerShellModules -ModuleName $module -GalleryVersion $moduleGalleryInfo.Version # Check again the current Version as we uninstalled some old versions $currentVersion = (Get-InstalledModule -Name $module).Version if ($moduleGalleryInfo.Version -ne $currentVersion) { Write-Host -ForegroundColor Cyan "$module - Install from PowerShellGallery version $($moduleGalleryInfo.Version) - Release date: $($moduleGalleryInfo.PublishedDate)" if (-not($SimulationMode)) { try { Install-Module -Name $module -Force -ErrorAction Stop Remove-OldPowerShellModules -ModuleName $module -GalleryVersion $moduleGalleryInfo.Version } catch { Write-Warning "$module - $($_.Exception.Message)" } } } } # https://invoke-thebrain.com/2018/12/comparing-version-numbers-powershell/ elseif ([version]$currentVersion -gt [version]$moduleGalleryInfo.Version) { Write-Host -ForegroundColor Yellow "$module - the current version $currentVersion is newer than the version available on PowerShell Gallery $($moduleGalleryInfo.Version) (Release date: $($moduleGalleryInfo.PublishedDate)). Sometimes happens when you install a module from another repository or via .exe/.msi or if you change the version number manually." } elseif ([version]$currentVersion -lt [version]$moduleGalleryInfo.Version) { Write-Host -ForegroundColor Cyan "$module - Update from PowerShellGallery version " -NoNewline Write-Host -ForegroundColor White "$currentVersion -> $($moduleGalleryInfo.Version) " -NoNewline Write-Host -ForegroundColor Cyan "- Release date: $($moduleGalleryInfo.PublishedDate)" if (-not($SimulationMode)) { try { Update-Module -Name $module -Force -ErrorAction Stop Remove-OldPowerShellModules -ModuleName $module -GalleryVersion $moduleGalleryInfo.Version } catch { if ($_.Exception.Message -match 'Authenticode') { Write-Host -ForegroundColor Yellow "$module - The module certificate used by the creator is either changed since the last module install or the module sign status has changed." if ($SkipPublisherCheck.IsPresent) { Write-Host -ForegroundColor Cyan "$module - SkipPublisherCheck Parameter is present, so install will run without Authenticode check" Write-Host -ForegroundColor Cyan "$module - Install from PowerShellGallery version $($moduleGalleryInfo.Version) - Release date: $($moduleGalleryInfo.PublishedDate)" try { Install-Module -Name $module -Force -SkipPublisherCheck } catch { Write-Warning "$module - $($_.Exception.Message)" } Remove-OldPowerShellModules -ModuleName $module -GalleryVersion $moduleGalleryInfo.Version } else { Write-Warning "$module - If you want to update this module, run again with -SkipPublisherCheck switch, but please keep in mind the security risk" } } else { Write-Warning "$module - $($_.Exception.Message)" } } } } } } } } pause } until ($selection -eq 'q')