[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 $OutputEncoding = [System.Text.Encoding]::UTF8 winget source remove msstore 2>$null $apps = @( "Microsoft.PowerShell", "VideoLAN.VLC", "Foxit.FoxitReader", "Python.Python.3.14", "Greenshot.Greenshot", "Google.Chrome" ) $logFile = Join-Path $env:TEMP "basics-install-log.txt" "=== Run started $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') on $env:COMPUTERNAME ===" | Out-File -FilePath $logFile -Append -Encoding utf8 $commonArgs = "--accept-source-agreements", "--accept-package-agreements", "--silent" $results = @() foreach ($id in $apps) { if ($id -eq "Google.Chrome") { Get-Process -Name "chrome" -ErrorAction SilentlyContinue | Stop-Process -Force Start-Sleep -Seconds 2 } $installed = winget list --id $id --exact 2>$null | Select-String $id if ($installed) { Write-Host "Upgrading $id..." $output = winget upgrade --id $id --exact @commonArgs 2>&1 | Out-String $action = "Upgrade" } else { Write-Host "Installing $id..." $output = winget install --id $id --exact @commonArgs 2>&1 | Out-String $action = "Install" } $success = $LASTEXITCODE -eq 0 $status = if ($success) { "OK" } elseif ($output -match "No applicable update found") { "OK (already up to date)" } else { "FAILED" } $results += [PSCustomObject]@{ App = $id Action = $action Status = $status } "[$action] $id -> $status" | Out-File -FilePath $logFile -Append -Encoding utf8 if ($status -eq "FAILED") { $output | Out-File -FilePath $logFile -Append -Encoding utf8 } } "=== Run finished $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') ===" | Out-File -FilePath $logFile -Append -Encoding utf8 Write-Host "" Write-Host "Summary:" $results | Format-Table -AutoSize Write-Host "Full log: $logFile" Write-Host "All tasks complete!" Read-Host "Press Enter to exit"