diff --git a/wingetInstaller.ps1 b/wingetInstaller.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..50cac6737ffd3984adf2ae83fd87147b15445498 --- /dev/null +++ b/wingetInstaller.ps1 @@ -0,0 +1,173 @@ +# Self-elevate the script if required +if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) { + if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) { + # PowerShell 5 and later + $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments + Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine + Exit + } +} + +# List of applications to install +$applications = @( + # Applications available via PatchMyPC + "dotPDN.PaintDotNet", + "notepad++.notepad++", + "PuTTY.PuTTY", + "Posit.RStudio", + "Microsoft.VisualStudioCode", + "VideoLAN.VLC", + "Mozilla.Firefox", + "WiresharkFoundation.Wireshark", + "WinSCP.WinSCP", + "7zip.7zip", + "HandBrake.HandBrake", + "OBSProject.OBSStudio", + + # Applications to install manually or with winget + "Zoom.Zoom", + "JetBrains.IntelliJIDEA.Community", + "AivarAnnamaa.Thonny", + "Insecure.Nmap", + "JetBrains.PyCharm.Community", + "Racket.Racket" +) + +# Initialize status tracking hashtables +$installationStatus = @{} +$updateStatus = @{} +$errorMessages = @{} + +# Function to check if an application is installed +function Test-ApplicationInstalled { + param ( + [string]$AppId + ) + + $listResult = winget list --id $AppId --accept-source-agreements 2>&1 + return $listResult -like "*$AppId*" +} + +# Function to check if an application has updates available +function Test-UpdateAvailable { + param ( + [string]$AppId + ) + + $upgradeResult = winget upgrade --id $AppId 2>&1 + return $upgradeResult -notlike "*No applicable upgrade found.*" +} + +# Add a start message +Write-Host "Starting installation/update process..." -ForegroundColor Green +Write-Host "This script will install or update the following applications:" -ForegroundColor Yellow +$applications | ForEach-Object { Write-Host " - $_" -ForegroundColor Cyan } +Write-Host "" + +# Counter for tracking progress +$totalApps = $applications.Count +$currentApp = 0 + +# Iterate through the applications and install or update each +foreach ($app in $applications) { + $currentApp++ + Write-Host "`nProcessing ($currentApp/$totalApps): $app..." -ForegroundColor Yellow + + try { + # Check if the application is already installed + $wasInstalled = Test-ApplicationInstalled -AppId $app + if ($wasInstalled) { + Write-Host "$app is already installed. Checking for updates..." -ForegroundColor Cyan + + # Check if updates are available + if (Test-UpdateAvailable -AppId $app) { + Write-Host "Update available for $app. Updating..." -ForegroundColor Green + winget upgrade --id $app --silent --accept-package-agreements --accept-source-agreements + + # Verify update + if (-not (Test-UpdateAvailable -AppId $app)) { + $updateStatus[$app] = "Success" + Write-Host "$app updated successfully!" -ForegroundColor Green + } else { + $updateStatus[$app] = "Failed" + Write-Host "Update may have failed for $app" -ForegroundColor Yellow + } + } else { + $updateStatus[$app] = "UpToDate" + Write-Host "$app is up to date." -ForegroundColor Cyan + } + } else { + Write-Host "$app is not installed. Installing..." -ForegroundColor Green + winget install --id $app --silent --accept-package-agreements --accept-source-agreements + + # Verify installation + if (Test-ApplicationInstalled -AppId $app) { + $installationStatus[$app] = "Success" + Write-Host "$app installed successfully!" -ForegroundColor Green + } else { + $installationStatus[$app] = "Failed" + Write-Host "Installation may have failed for $app" -ForegroundColor Red + } + } + } catch { + $errorMessages[$app] = $_.Exception.Message + Write-Host "Failed to process $app. Error: $_" -ForegroundColor Red + } +} + +# Generate and display summary +Write-Host "`n===============================" -ForegroundColor Yellow +Write-Host "Installation/Update Summary" -ForegroundColor Yellow +Write-Host "===============================" -ForegroundColor Yellow + +# Show successful installations +$successfulInstalls = $installationStatus.GetEnumerator() | Where-Object { $_.Value -eq "Success" } +if ($successfulInstalls) { + Write-Host "`nSuccessfully Installed:" -ForegroundColor Green + $successfulInstalls | ForEach-Object { Write-Host " - $($_.Key)" -ForegroundColor Cyan } +} + +# Show failed installations +$failedInstalls = $installationStatus.GetEnumerator() | Where-Object { $_.Value -eq "Failed" } +if ($failedInstalls) { + Write-Host "`nFailed Installations (May Need Manual Installation):" -ForegroundColor Red + $failedInstalls | ForEach-Object { + Write-Host " - $($_.Key)" -ForegroundColor Red + if ($errorMessages.ContainsKey($_.Key)) { + Write-Host " Error: $($errorMessages[$_.Key])" -ForegroundColor Red + } + } +} + +# Show successful updates +$successfulUpdates = $updateStatus.GetEnumerator() | Where-Object { $_.Value -eq "Success" } +if ($successfulUpdates) { + Write-Host "`nSuccessfully Updated:" -ForegroundColor Green + $successfulUpdates | ForEach-Object { Write-Host " - $($_.Key)" -ForegroundColor Cyan } +} + +# Show up-to-date applications +$upToDate = $updateStatus.GetEnumerator() | Where-Object { $_.Value -eq "UpToDate" } +if ($upToDate) { + Write-Host "`nAlready Up To Date:" -ForegroundColor Cyan + $upToDate | ForEach-Object { Write-Host " - $($_.Key)" -ForegroundColor Cyan } +} + +# Show failed updates +$failedUpdates = $updateStatus.GetEnumerator() | Where-Object { $_.Value -eq "Failed" } +if ($failedUpdates) { + Write-Host "`nFailed Updates:" -ForegroundColor Red + $failedUpdates | ForEach-Object { + Write-Host " - $($_.Key)" -ForegroundColor Red + if ($errorMessages.ContainsKey($_.Key)) { + Write-Host " Error: $($errorMessages[$_.Key])" -ForegroundColor Red + } + } +} + +Write-Host "`nProcess completed! Please review the summary above." -ForegroundColor Yellow +Write-Host "For failed installations or updates, please try installing manually." -ForegroundColor Yellow + +# Keep the terminal open +Write-Host "`nPress any key to exit..." -ForegroundColor Cyan +[System.Console]::ReadKey() > $null