# import Appx module if the powershell version is 7/core if ( $psversionTable.PSEdition -eq "core" ) { import-Module -name Appx -UseWIndowsPowershell -WarningAction:SilentlyContinue } #Get the Working Dir $Script:WorkingDir = $PSScriptRoot <# FUNCTIONS #> . "$WorkingDir\functions\Get-WingetCmd.ps1" #Function to start or update popup Function Start-PopUp ($Message) { if (!$PopUpWindow) { #Create window $inputXML = @" "@ [xml]$XAML = ($inputXML -replace "x:N", "N") #Read the form $Reader = (New-Object System.Xml.XmlNodeReader $XAML) $Script:PopUpWindow = [Windows.Markup.XamlReader]::Load($Reader) $PopUpWindow.Icon = $IconBase64 #Store Form Objects In PowerShell $XAML.SelectNodes("//*[@Name]") | ForEach-Object { Set-Variable -Name "$($_.Name)" -Value $PopUpWindow.FindName($_.Name) -Scope Script } $PopUpWindow.Show() } #Message to display $PopUpLabel.Text = $Message #Update PopUp $PopUpWindow.Dispatcher.Invoke([action] {}, "Render") } #Function to close popup Function Close-PopUp { $Script:PopUpWindow.Close() $Script:PopUpWindow = $null } function Get-WingetAppInfo ($SearchApp) { class Software { [string]$Name [string]$Id } #Search for winget apps $AppResult = & $Winget search $SearchApp --accept-source-agreements --source winget | Out-String #Start Conversion of winget format to an array. Check if "-----" exists if (!($AppResult -match "-----")) { Start-PopUp "No application found!" Start-Sleep 2 Close-PopUp return } #Split winget output to lines $lines = $AppResult.Split([Environment]::NewLine) | Where-Object { $_ } # Find the line that starts with "------" $fl = 0 while (-not $lines[$fl].StartsWith("-----")) { $fl++ } $fl = $fl - 1 #Get header titles [without remove separator] $index = $lines[$fl] -split '(?<=\s)(?!\s)' # Line $fl has the header, we can find char where we find ID and Version [and manage non latin characters] $idStart = $($index[0] -replace '[\u4e00-\u9fa5]', '**').Length $versionStart = $idStart + $($index[1] -replace '[\u4e00-\u9fa5]', '**').Length # Now cycle in real package and split accordingly $searchList = @() For ($i = $fl + 2; $i -le $lines.Length; $i++) { $line = $lines[$i] -replace "[\u2026]", " " #Fix "..." in long names # If line contains an ID (Alphanumeric | Literal "." | Alphanumeric) if ($line -match "\w\.\w") { $software = [Software]::new() #Manage non latin characters $nameDeclination = $($line.Substring(0, $idStart) -replace '[\u4e00-\u9fa5]', '**').Length - $line.Substring(0, $idStart).Length $software.Name = $line.Substring(0, $idStart - $nameDeclination).TrimEnd() $software.Id = $line.Substring($idStart - $nameDeclination, $versionStart - $idStart).TrimEnd() #add formatted soft to list $searchList += $software } } return $searchList } function Get-WingetInstalledApps { #Json File where to export install apps $jsonFile = "$env:TEMP\Installed_Apps.json" #Get list of installed Winget apps to json file & $Winget export -o $jsonFile --accept-source-agreements | Out-Null #Convert from json file $InstalledApps = get-content $jsonFile | ConvertFrom-Json #Return app list return $InstalledApps.Sources.Packages.PackageIdentifier | Sort-Object | Get-Unique } function Start-Installations ($AppsToInstall) { #Run Winget-Install script Start-PopUp "Installing applications..." $WAUInstallPath = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Romanitho\Winget-AutoUpdate\" -Name InstallLocation #Try with admin rights. try { Start-Process "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File ""$WAUInstallPath\Winget-Install.ps1"" -AppIDs ""$AppsToInstall""" -Wait -Verb RunAs } catch { Start-Process "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File ""$WAUInstallPath\Winget-Install.ps1"" -AppIDs ""$AppsToInstall""" -Wait } #Installs finished Start-PopUp "Done!" Start-Sleep 2 #Close Popup Close-PopUp } function Start-Uninstallations ($AppsToUninstall) { #Run Winget-Install script Start-PopUp "Uninstalling applications..." $WAUInstallPath = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Romanitho\Winget-AutoUpdate\" -Name InstallLocation #Run Winget-Install -Uninstall Start-Process "powershell.exe" -Argument "-NoProfile -ExecutionPolicy Bypass -File ""$WAUInstallPath\Winget-Install.ps1"" -AppIDs ""$AppsToUninstall"" -Uninstall" -Wait -Verb RunAs Close-PopUp } function Start-InstallGUI { ### FORM CREATION ### # GUI XAML file $inputXML = @"