diff --git a/Winget-AllinOne.ps1 b/Winget-AllinOne.ps1 new file mode 100644 index 0000000..7e3fa85 --- /dev/null +++ b/Winget-AllinOne.ps1 @@ -0,0 +1,133 @@ +<# +.SYNOPSIS +Install apps with Winget-Install and configure Winget-AutoUpdate + +.DESCRIPTION +Install apps with Winget from a list file (apps.txt). +Install Winget-AutoUpdate to get apps daily updated +https://github.com/Romanitho/Winget-AllinOne +#> + + +<# FUNCTIONS #> + +function Download-GitHubRepository { + param( + [Parameter()] [string] $Url, + [Parameter()] [string] $Location + ) + + # Force to create a zip file + $ZipFile = "$location\temp.zip" + New-Item $ZipFile -ItemType File -Force | Out-Null + + # download the zip + Write-Host 'Starting downloading the GitHub Repository' + Invoke-RestMethod -Uri $Url -OutFile $ZipFile + Write-Host 'Download finished' + + #Extract Zip File + Write-Host 'Starting unzipping the GitHub Repository locally' + Expand-Archive -Path $ZipFile -DestinationPath $Location -Force + Get-ChildItem -Path $Location -Recurse | Unblock-File + Write-Host 'Unzip finished' + + # remove the zip file + Remove-Item -Path $ZipFile -Force +} + +function Get-WingetStatus{ + $hasAppInstaller = Get-AppXPackage -name 'Microsoft.DesktopAppInstaller' + if (!($hasAppInstaller)){ + Write-Host -ForegroundColor Yellow "Installing WinGet..." + Add-AppxPackage -Path https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx + $releases_url = "https://api.github.com/repos/microsoft/winget-cli/releases/latest" + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + $releases = Invoke-RestMethod -uri "$($releases_url)" + $latestRelease = $releases.assets | Where-Object { $_.browser_download_url.EndsWith("msixbundle") } | Select-Object -First 1 + Add-AppxPackage -Path $latestRelease.browser_download_url + Write-Host -ForegroundColor Green "WinGet successfully installed." + } +else { + Write-Host -ForegroundColor Green "WinGet is already installed." + } +} + +function Get-WingetCmd { + #Get WinGet Location in User context + $WingetCmd = Get-Command winget.exe -ErrorAction SilentlyContinue + if ($WingetCmd){ + $Script:winget = $WingetCmd.Source + } + #Get WinGet Location in System context (WinGet < 1.17) + elseif (Test-Path "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe\AppInstallerCLI.exe"){ + $Script:winget = Resolve-Path "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe\AppInstallerCLI.exe" | Select-Object -ExpandProperty Path + } + #Get WinGet Location in System context (WinGet > 1.17) + elseif (Test-Path "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe\winget.exe"){ + $Script:winget = Resolve-Path "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe\winget.exe" | Select-Object -ExpandProperty Path + } + else{ + break + } +} + +function Get-AppList{ + if (Test-Path "$PSScriptRoot\apps.txt"){ + $AppList = Get-Content -Path "$PSScriptRoot\apps_to_install.txt" + return $AppList -join "," + } +} + +function Get-ExcludedApps{ + if (Test-Path "$PSScriptRoot\excluded_apps.txt"){ + Write-Host "Installing Custom 'excluded_apps.txt' file" + Copy-Item -Path "$PSScriptRoot\excluded_apps.txt" -Destination "$env:ProgramData\winget-update" -Recurse -Force -ErrorAction SilentlyContinue + } + else{ + Write-Host "Keeping default 'excluded_apps.txt' file" + } +} + + +<# MAIN #> + +Write-host "###################################" +Write-host "# #" +Write-host "# Winget AllinOne #" +Write-host "# #" +Write-host "###################################`n" + +#Temp folder +$Location = "$env:ProgramData\Winget" + +#Download Winget-AutoUpdate +Download-GitHubRepository "https://github.com/Romanitho/Winget-AutoUpdate/archive/refs/heads/main.zip" $Location + +#Download Winget-Install +Download-GitHubRepository "https://github.com/Romanitho/Winget-Install/archive/refs/heads/main.zip" $Location + +#Check Winget is installed, and install if not +Get-WingetStatus + +#Get App List +$AppToInstall = Get-AppList + +#Install Winget-Autoupdate +Write-Host 'Installing Winget-AutoUpdate...' +Start-Process "powershell.exe" -Argument "-executionpolicy bypass -file `"$Location\Winget-AutoUpdate-main\winget-install-and-update.ps1`" -Silent -DoNotUpdate" -Wait + +#Run Winget-Install +Write-Host 'Running Winget-Install...' +Start-Process "powershell.exe" -Argument "-executionpolicy bypass -command `"$Location\Winget-Install-main\winget-install.ps1 -AppIDs $AppToInstall`"" -Wait + +#Configure ExcludedApps +Get-ExcludedApps + +#Run WAU +Write-Host "Running Winget-AutoUpdate" +Get-ScheduledTask -TaskName "Winget Update" -ErrorAction SilentlyContinue | Start-ScheduledTask -ErrorAction SilentlyContinue + +Remove-Item -Path $Location -Force -Recurse +Write-Host "End." -ForegroundColor Cyan +Start-Sleep 3 \ No newline at end of file