# BleachBit Script # Downloads BleachBit portable, extracts it, and runs specified cleaners param( # Array of cleaners to run - can be customized for different use cases [string[]]$Cleaners = @( "adobe_reader.cache", "adobe_reader.mru", "adobe_reader.tmp", "amule.known_clients", "amule.known_files", "amule.logs", "amule.temp", "brave.cache", "chromium.cache", "chromium.vacuum", "deepscan.backup", "deepscan.ds_store", "deepscan.thumbs_db", "deepscan.tmp", "deepscan.vim_swap_root", "deepscan.vim_swap_user", "discord.cache", "discord.vacuum", "filezilla.mru", "firefox.cache", "firefox.crash_reports", "firefox.url_history", "flash.cache", "flash.cookies", "gimp.tmp", "google_chrome.cache", "google_earth.temporary_files", "google_toolbar.search_history", "gpodder.cache", "gpodder.logs", "hexchat.logs", "hippo_opensim_viewer.cache", "internet_explorer.cache", "java.cache", "libreoffice.history", "microsoft_edge.cache", "microsoft_office.debug_logs", "microsoft_office.mru", "midnightcommander.history", "miro.cache", "miro.logs", "octave.history", "openofficeorg.cache", "openofficeorg.recent_documents", "opera.cache", "paint.mru", "palemoon.cache", "pidgin.cache", "pidgin.logs", "realplayer.logs", "safari.cache", "screenlets.logs", "seamonkey.cache", "secondlife_viewer.cache", "secondlife_viewer.logs", "silverlight.temp", "skype.installers", "slack.cache", "smartftp.cache", "smartftp.log", "smartftp.mru", "system.recycle_bin", "system.tmp", "system.updates", "teamviewer.logs", "teamviewer.mru", "thunderbird.cache", "vim.history", "vlc.memory_dump", "vlc.mru", "vuze.cache", "vuze.logs", "vuze.stats", "vuze.temp", "warzone2100.logs", "waterfox.cache", "winamp.mru", "windows_defender.backup", "windows_defender.history", "windows_defender.logs", "windows_defender.quarantine", "windows_defender.temp", "windows_explorer.mru", "windows_explorer.run", "windows_explorer.search_history", "windows_explorer.shellbags", "windows_explorer.thumbnails", "windows_media_player.cache", "windows_media_player.mru", "winrar.history", "winrar.temp", "winzip.mru", "wordpad.mru", "yahoo_messenger.cache", "yahoo_messenger.chat_logs", "yahoo_messenger.logs", "zoom.cache", "zoom.logs" ), # Download URL - can be overridden for different versions [string]$DownloadURL = "https://download.bleachbit.org/BleachBit-5.0.2-portable.zip", # Installation path [string]$InstallPath = "C:\Quest\BleachBit" ) # Set strict mode Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" try { # Create installation directory if it doesn't exist if (-not (Test-Path $InstallPath)) { New-Item -Path $InstallPath -ItemType Directory -Force | Out-Null } $zipPath = "$InstallPath\BleachBit-5.0.2-portable.zip" $exePath = "$InstallPath\bleachbit_console.exe" # Download BleachBit if not already present if (-not (Test-Path $zipPath)) { Write-Host "Downloading BleachBit..." Invoke-WebRequest -Uri $DownloadURL -OutFile $zipPath -UseBasicParsing Write-Host "Download complete." } # Extract if executable doesn't exist if (-not (Test-Path $exePath)) { Write-Host "Extracting BleachBit..." # Use Expand-Archive for extraction (built-in since PowerShell 5.0) $tempExtractPath = "$env:TEMP\BleachBit_Extract" if (Test-Path $tempExtractPath) { Remove-Item -Path $tempExtractPath -Recurse -Force } Expand-Archive -Path $zipPath -DestinationPath $tempExtractPath -Force # Move contents to install path $extractedContent = Get-ChildItem -Path $tempExtractPath -Recurse foreach ($item in $extractedContent) { $destination = $item.FullName.Replace($tempExtractPath, $InstallPath) if ($item.PSIsContainer) { if (-not (Test-Path $destination)) { New-Item -Path $destination -ItemType Directory -Force | Out-Null } } else { $parentDir = Split-Path $destination -Parent if (-not (Test-Path $parentDir)) { New-Item -Path $parentDir -ItemType Directory -Force | Out-Null } Move-Item -Path $item.FullName -Destination $destination -Force } } # Clean up temp extraction Remove-Item -Path $tempExtractPath -Recurse -Force Write-Host "Extraction complete." } # Verify executable exists if (-not (Test-Path $exePath)) { throw "BleachBit executable not found at: $exePath" } # Build the cleaner string $cleanerString = $Cleaners -join " " Write-Host "Running BleachBit cleaners..." Write-Host "Cleaners: $cleanerString" # Run BleachBit with the specified cleaners $output = & $exePath --clean $cleanerString 2>&1 # Return success response as JSON $result = @{ success = $true cleaners = $Cleaners output = $output message = "BleachBit cleanup completed successfully" } | ConvertTo-Json -Compress Write-Output $result } catch { # Return error response as JSON $errorResult = @{ success = $false error = $_.Exception.Message cleaners = $Cleaners } | ConvertTo-Json -Compress Write-Error $errorResult Write-Output $errorResult }