diff --git a/Winget-AutoUpdate-Install.ps1 b/Winget-AutoUpdate-Install.ps1 index 171f51c..9989bbf 100644 --- a/Winget-AutoUpdate-Install.ps1 +++ b/Winget-AutoUpdate-Install.ps1 @@ -19,11 +19,18 @@ Do not run Winget-AutoUpdate after installation. By default, Winget-AutoUpdate i .PARAMETER DisableWAUAutoUpdate Disable Winget-AutoUpdate update checking. By default, WAU auto update if new version is available on Github. +.PARAMETER UseWhiteList +Use White List instead of Black List. This setting will not create the "exclude_apps.txt" but "include_apps.txt" + .PARAMETER Uninstall Remove scheduled tasks and scripts. .EXAMPLE .\winget-install-and-update.ps1 -Silent -DoNotUpdate + +.EXAMPLE +.\winget-install-and-update.ps1 -Silent -UseWhiteList + #> [CmdletBinding()] @@ -32,7 +39,8 @@ param( [Parameter(Mandatory=$False)] [Alias('Path')] [String] $WingetUpdatePath = "$env:ProgramData\Winget-AutoUpdate", [Parameter(Mandatory=$False)] [Switch] $DoNotUpdate = $false, [Parameter(Mandatory=$False)] [Switch] $DisableWAUAutoUpdate = $false, - [Parameter(Mandatory=$False)] [Switch] $Uninstall = $false + [Parameter(Mandatory=$False)] [Switch] $Uninstall = $false, + [Parameter(Mandatory=$False)] [Switch] $UseWhiteList = $false ) @@ -86,20 +94,24 @@ function Install-Prerequisites{ function Install-WingetAutoUpdate{ try{ - #Check if previous version location exists and delete - $OldWingetUpdatePath = $WingetUpdatePath.Replace("\Winget-AutoUpdate","\winget-update") - if (Test-Path ($OldWingetUpdatePath)){ - Remove-Item $OldWingetUpdatePath -Force -Recurse - } - Get-ScheduledTask -TaskName "Winget Update" -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm:$False - Get-ScheduledTask -TaskName "Winget Update Notify" -ErrorAction SilentlyContinue | Unregister-ScheduledTask -Confirm:$False - #Copy files to location if (!(Test-Path $WingetUpdatePath)){ New-Item -ItemType Directory -Force -Path $WingetUpdatePath } Copy-Item -Path "$PSScriptRoot\Winget-AutoUpdate\*" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue - Copy-Item -Path "$PSScriptRoot\excluded_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue + + #White List or Black List apps + if ($UseWhiteList){ + if (Test-Path "$PSScriptRoot\included_apps.txt"){ + Copy-Item -Path "$PSScriptRoot\included_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue + } + else{ + New-Item -Path $WingetUpdatePath -Name "included_apps.txt" -ItemType "file" -ErrorAction SilentlyContinue + } + } + else { + Copy-Item -Path "$PSScriptRoot\excluded_apps.txt" -Destination $WingetUpdatePath -Recurse -Force -ErrorAction SilentlyContinue + } # Set dummy regkeys for notification name and icon & reg add "HKCR\AppUserModelId\Windows.SystemToast.Winget.Notification" /v DisplayName /t REG_EXPAND_SZ /d "Application Update" /f | Out-Null @@ -130,6 +142,7 @@ function Install-WingetAutoUpdate{ $(!($DisableWAUAutoUpdate)) + $UseWhiteList "@ $ConfigXML.Save("$WingetUpdatePath\config\config.xml") diff --git a/Winget-AutoUpdate/config/about.xml b/Winget-AutoUpdate/config/about.xml index 09ebf9e..c5291b8 100644 --- a/Winget-AutoUpdate/config/about.xml +++ b/Winget-AutoUpdate/config/about.xml @@ -1,7 +1,7 @@ Winget-AutoUpdate (WAU) - 1.6.3 + 1.7.0 Romanitho https://github.com/Romanitho/Winget-AutoUpdate diff --git a/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 b/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 new file mode 100644 index 0000000..aee2a87 --- /dev/null +++ b/Winget-AutoUpdate/functions/Get-IncludedApps.ps1 @@ -0,0 +1,5 @@ +function Get-IncludedApps{ + if (Test-Path "$WorkingDir\included_apps.txt"){ + return Get-Content -Path "$WorkingDir\included_apps.txt" + } +} \ No newline at end of file diff --git a/Winget-AutoUpdate/functions/Get-WAUConfig.ps1 b/Winget-AutoUpdate/functions/Get-WAUConfig.ps1 new file mode 100644 index 0000000..4d89ea4 --- /dev/null +++ b/Winget-AutoUpdate/functions/Get-WAUConfig.ps1 @@ -0,0 +1,14 @@ +function Get-WAUConfig{ + + [xml]$WAUConfig = Get-Content "$WorkingDir\config\config.xml" -Encoding UTF8 -ErrorAction SilentlyContinue + + #Check if WAU is configured for Black or White List + if ($true -eq [System.Convert]::ToBoolean($WAUConfig.app.UseWAUWhiteList)){ + Write-Log "WAU uses White List config" + $Script:UseWhiteList = $true + } + else{ + Write-Log "WAU uses Black List config" + $Script:UseWhiteList = $false + } +} \ No newline at end of file diff --git a/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 b/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 index ffe576a..2817235 100644 --- a/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 +++ b/Winget-AutoUpdate/functions/Get-WingetOutdatedApps.ps1 @@ -10,15 +10,15 @@ function Get-WingetOutdatedApps { $WingetPath = (Resolve-Path "C:\Program Files\WindowsApps\Microsoft.DesktopAppInstaller_*_x64__8wekyb3d8bbwe").Path #Get Winget Location in User context if ($WingetCmd){ - $Script:winget = (Get-Command winget.exe -ErrorAction SilentlyContinue).Source + $Script:Winget = (Get-Command winget.exe -ErrorAction SilentlyContinue).Source } #Get Winget Location in System context (WinGet < 1.17) elseif (Test-Path "$WingetPath\AppInstallerCLI.exe"){ - $Script:winget = "$WingetPath\AppInstallerCLI.exe" + $Script:Winget = "$WingetPath\AppInstallerCLI.exe" } #Get Winget Location in System context (WinGet > 1.17) elseif (Test-Path "$WingetPath\winget.exe"){ - $Script:winget = "$WingetPath\winget.exe" + $Script:Winget = "$WingetPath\winget.exe" } else{ Write-Log "Winget not installed !" "Red" @@ -26,10 +26,10 @@ function Get-WingetOutdatedApps { } #Run winget to list apps and accept source agrements (necessary on first run) - & $upgradecmd list --accept-source-agreements | Out-Null + & $Winget list --accept-source-agreements | Out-Null #Get list of available upgrades on winget format - $upgradeResult = & $upgradecmd upgrade | Out-String + $upgradeResult = & $Winget upgrade | Out-String #Start Convertion of winget format to an array. Check if "-----" exists if (!($upgradeResult -match "-----")){ diff --git a/Winget-AutoUpdate/functions/Update-App.ps1 b/Winget-AutoUpdate/functions/Update-App.ps1 new file mode 100644 index 0000000..28545ce --- /dev/null +++ b/Winget-AutoUpdate/functions/Update-App.ps1 @@ -0,0 +1,59 @@ +Function Update-App ($app) { + + #Send available update notification + Write-Log "Updating $($app.Name) from $($app.Version) to $($app.AvailableVersion)..." "Cyan" + $Title = $NotifLocale.local.outputs.output[2].title -f $($app.Name) + $Message = $NotifLocale.local.outputs.output[2].message -f $($app.Version), $($app.AvailableVersion) + $MessageType = "info" + $Balise = $($app.Name) + Start-NotifTask $Title $Message $MessageType $Balise + + #Winget upgrade + Write-Log "########## WINGET UPGRADE PROCESS STARTS FOR APPLICATION ID '$($App.Id)' ##########" "Gray" + #Run Winget Upgrade command + & $Winget upgrade --id $($app.Id) --all --accept-package-agreements --accept-source-agreements -h | Tee-Object -file $LogFile -Append + + #Check if application updated properly + $CheckOutdated = Get-WingetOutdatedApps + $FailedToUpgrade = $false + foreach ($CheckApp in $CheckOutdated){ + if ($($CheckApp.Id) -eq $($app.Id)) { + #If app failed to upgrade, run Install command + & $Winget install --id $($app.Id) --accept-package-agreements --accept-source-agreements -h | Tee-Object -file $LogFile -Append + #Check if application installed properly + $CheckOutdated2 = Get-WingetOutdatedApps + foreach ($CheckApp2 in $CheckOutdated2){ + if ($($CheckApp2.Id) -eq $($app.Id)) { + $FailedToUpgrade = $true + } + } + } + } + Write-Log "########## WINGET UPGRADE PROCESS FINISHED FOR APPLICATION ID '$($App.Id)' ##########" "Gray" + + #Notify installation + if ($FailedToUpgrade -eq $false){ + #Send success updated app notification + Write-Log "$($app.Name) updated to $($app.AvailableVersion) !" "Green" + + #Send Notif + $Title = $NotifLocale.local.outputs.output[3].title -f $($app.Name) + $Message = $NotifLocale.local.outputs.output[3].message -f $($app.AvailableVersion) + $MessageType = "success" + $Balise = $($app.Name) + Start-NotifTask $Title $Message $MessageType $Balise + + $InstallOK += 1 + } + else { + #Send failed updated app notification + Write-Log "$($app.Name) update failed." "Red" + + #Send Notif + $Title = $NotifLocale.local.outputs.output[4].title -f $($app.Name) + $Message = $NotifLocale.local.outputs.output[4].message + $MessageType = "error" + $Balise = $($app.Name) + Start-NotifTask $Title $Message $MessageType $Balise + } +} \ No newline at end of file diff --git a/Winget-AutoUpdate/winget-upgrade.ps1 b/Winget-AutoUpdate/winget-upgrade.ps1 index f526a31..692cafb 100644 --- a/Winget-AutoUpdate/winget-upgrade.ps1 +++ b/Winget-AutoUpdate/winget-upgrade.ps1 @@ -35,8 +35,14 @@ if (Test-Network){ } } - #Get exclude apps list - $toSkip = Get-ExcludedApps + #Get White or Black list + Get-WAUConfig + if ($UseWhiteList){ + $toUpdate = Get-IncludedApps + } + else{ + $toSkip = Get-ExcludedApps + } #Get outdated Winget packages Write-Log "Checking application updates on Winget Repository..." "yellow" @@ -51,80 +57,43 @@ if (Test-Network){ } #Count good update installations - $InstallOK = 0 + $Script:InstallOK = 0 - #For each app, notify and update - foreach ($app in $outdated){ - - if (-not ($toSkip -contains $app.Id) -and $($app.Version) -ne "Unknown"){ - - #Send available update notification - Write-Log "Updating $($app.Name) from $($app.Version) to $($app.AvailableVersion)..." "Cyan" - $Title = $NotifLocale.local.outputs.output[2].title -f $($app.Name) - $Message = $NotifLocale.local.outputs.output[2].message -f $($app.Version), $($app.AvailableVersion) - $MessageType = "info" - $Balise = $($app.Name) - Start-NotifTask $Title $Message $MessageType $Balise - - #Winget upgrade - Write-Log "########## WINGET UPGRADE PROCESS STARTS FOR APPLICATION ID '$($App.Id)' ##########" "Gray" - #Run Winget Upgrade command - & $UpgradeCmd upgrade --id $($app.Id) --all --accept-package-agreements --accept-source-agreements -h | Tee-Object -file $LogFile -Append - - #Check if application updated properly - $CheckOutdated = Get-WingetOutdatedApps - $FailedToUpgrade = $false - foreach ($CheckApp in $CheckOutdated){ - if ($($CheckApp.Id) -eq $($app.Id)) { - #If app failed to upgrade, run Install command - & $upgradecmd install --id $($app.Id) --accept-package-agreements --accept-source-agreements -h | Tee-Object -file $LogFile -Append - #Check if application installed properly - $CheckOutdated2 = Get-WingetOutdatedApps - foreach ($CheckApp2 in $CheckOutdated2){ - if ($($CheckApp2.Id) -eq $($app.Id)) { - $FailedToUpgrade = $true - } - } - } - } - Write-Log "########## WINGET UPGRADE PROCESS FINISHED FOR APPLICATION ID '$($App.Id)' ##########" "Gray" - - #Notify installation - if ($FailedToUpgrade -eq $false){ - #Send success updated app notification - Write-Log "$($app.Name) updated to $($app.AvailableVersion) !" "Green" - - #Send Notif - $Title = $NotifLocale.local.outputs.output[3].title -f $($app.Name) - $Message = $NotifLocale.local.outputs.output[3].message -f $($app.AvailableVersion) - $MessageType = "success" - $Balise = $($app.Name) - Start-NotifTask $Title $Message $MessageType $Balise - - $InstallOK += 1 + #If White List + if ($UseWhiteList){ + #For each app, notify and update + foreach ($app in $outdated){ + if (($toUpdate -contains $app.Id) -and $($app.Version) -ne "Unknown"){ + Update-App $app } - else { - #Send failed updated app notification - Write-Log "$($app.Name) update failed." "Red" - - #Send Notif - $Title = $NotifLocale.local.outputs.output[4].title -f $($app.Name) - $Message = $NotifLocale.local.outputs.output[4].message - $MessageType = "error" - $Balise = $($app.Name) - Start-NotifTask $Title $Message $MessageType $Balise + #if current app version is unknown + elseif($($app.Version) -eq "Unknown"){ + Write-Log "$($app.Name) : Skipped upgrade because current version is 'Unknown'" "Gray" + } + #if app is in "excluded list" + else{ + Write-Log "$($app.Name) : Skipped upgrade because it is not in the included app list" "Gray" } - } - #if current app version is unknown - elseif($($app.Version) -eq "Unknown"){ - Write-Log "$($app.Name) : Skipped upgrade because current version is 'Unknown'" "Gray" - } - #if app is in "excluded list" - else{ - Write-Log "$($app.Name) : Skipped upgrade because it is in the excluded app list" "Gray" } } - + #If Black List + else{ + #For each app, notify and update + foreach ($app in $outdated){ + if (-not ($toSkip -contains $app.Id) -and $($app.Version) -ne "Unknown"){ + Update-App $app + } + #if current app version is unknown + elseif($($app.Version) -eq "Unknown"){ + Write-Log "$($app.Name) : Skipped upgrade because current version is 'Unknown'" "Gray" + } + #if app is in "excluded list" + else{ + Write-Log "$($app.Name) : Skipped upgrade because it is in the excluded app list" "Gray" + } + } + } + if ($InstallOK -gt 0){ Write-Log "$InstallOK apps updated ! No more update." "Green" }