From 94b344f59c37bbe576d5a1f21744f8ea8588f792 Mon Sep 17 00:00:00 2001 From: Joeri Date: Sat, 7 Feb 2026 12:24:15 +0100 Subject: [PATCH] - --- cleanup.ps1 | 186 ++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 166 insertions(+), 20 deletions(-) diff --git a/cleanup.ps1 b/cleanup.ps1 index ebb61ff..75b9cab 100644 --- a/cleanup.ps1 +++ b/cleanup.ps1 @@ -641,46 +641,192 @@ Write-Log "===================================================================== Write-Log "SECTION: System Optimization" -Level "INFO" Write-Log "================================================================================" -Level "INFO" +# Initialize structured output +$ScriptResult.system_optimization = @{ + "chkdsk" = @{ + "run" = $false + "success" = $false + "exit_code" = $null + "message" = "" + "reboot_required" = $false + "errors" = @() + } + "sfc" = @{ + "run" = $false + "success" = $false + "exit_code" = $null + "message" = "" + "files_repaired" = 0 + "errors" = @() + } + "dism" = @{ + "run" = $false + "success" = $false + "exit_code" = $null + "message" = "" + "component_repaired" = $false + "errors" = @() + } +} + # Run CHKDSK Write-Log "Running CHKDSK with /R option..." -Level "INFO" -Write-Log "Note: CHKDSK may require a system reboot to complete." -Level "WARNING" +Write-Log "Note: CHKDSK may schedule a disk check on next reboot." -Level "WARNING" try { - $ChkdskResult = cmd /c "echo y | chkdsk /R" 2>&1 | Out-String - $ScriptResult.system_optimization.chkdsk_run = $true - $ScriptResult.system_optimization.chkdsk_result = $ChkdskResult.Trim() - Write-Log "CHKDSK command executed." -Level "INFO" - Write-Log "CHKDSK output: $ChkdskResult" -Level "INFO" + $ChkdskProcess = Start-Process -FilePath "chkdsk" -ArgumentList "/R" -NoNewWindow -Wait -PassThru -ErrorAction Stop + $ExitCode = $ChkdskProcess.ExitCode + + $ScriptResult.system_optimization.chkdsk.run = $true + $ScriptResult.system_optimization.chkdsk.exit_code = $ExitCode + + # Parse exit codes + switch ($ExitCode) { + 0 { + $ScriptResult.system_optimization.chkdsk.success = $true + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK completed successfully. No errors found." + } + 1 { + $ScriptResult.system_optimization.chkdsk.success = $true + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK completed successfully. Errors corrected." + } + 2 { + $ScriptResult.system_optimization.chkdsk.success = $false + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK did not run due to a parameter error." + } + 3 { + $ScriptResult.system_optimization.chkdsk.success = $true + $ScriptResult.system_optimization.chkdsk.reboot_required = $true + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK completed with errors and requires a reboot to complete." + } + 4 { + $ScriptResult.system_optimization.chkdsk.success = $false + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK encountered errors but could not fix them." + } + 5 { + $ScriptResult.system_optimization.chkdsk.success = $false + $ScriptResult.system_optimization.chkdsk.reboot_required = $true + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK found errors but requires a reboot to fix them." + } + default { + $ScriptResult.system_optimization.chkdsk.success = $false + $ScriptResult.system_optimization.chkdsk.message = "CHKDSK completed with unexpected exit code: $ExitCode" + } + } + + Write-Log "CHKDSK exit code: $ExitCode" -Level "INFO" + Write-Log "CHKDSK message: $($ScriptResult.system_optimization.chkdsk.message)" -Level "INFO" + + if ($ScriptResult.system_optimization.chkdsk.reboot_required) { + Write-Log "System reboot is required to complete CHKDSK." -Level "WARNING" + } } catch { $ErrorMsg = "Failed to run CHKDSK: $($_.Exception.Message)" - $ScriptResult.system_optimization.errors += $ErrorMsg + $ScriptResult.system_optimization.chkdsk.errors += $ErrorMsg Write-Log $ErrorMsg -Level "ERROR" } # Run SFC Write-Log "Running System File Checker (SFC /scannow)..." -Level "INFO" try { - $SfcResult = sfc /scannow 2>&1 | Out-String - $ScriptResult.system_optimization.sfc_run = $true - $ScriptResult.system_optimization.sfc_result = $SfcResult.Trim() - Write-Log "SFC scan completed." -Level "INFO" - Write-Log "SFC output: $SfcResult" -Level "INFO" + $SfcProcess = Start-Process -FilePath "sfc" -ArgumentList "/scannow" -NoNewWindow -Wait -PassThru -ErrorAction Stop + $ExitCode = $SfcProcess.ExitCode + + $ScriptResult.system_optimization.sfc.run = $true + $ScriptResult.system_optimization.sfc.exit_code = $ExitCode + + # Parse exit codes + switch ($ExitCode) { + 0 { + $ScriptResult.system_optimization.sfc.success = $true + $ScriptResult.system_optimization.sfc.message = "SFC completed successfully. No integrity violations found." + $ScriptResult.system_optimization.sfc.files_repaired = 0 + } + 1 { + $ScriptResult.system_optimization.sfc.success = $true + $ScriptResult.system_optimization.sfc.message = "SFC completed successfully. Corrupted files were repaired." + $ScriptResult.system_optimization.sfc.files_repaired = 1 + } + 2 { + $ScriptResult.system_optimization.sfc.success = $false + $ScriptResult.system_optimization.sfc.message = "SFC could not perform the operation. User cancelled or Windows is in safe mode." + } + 3 { + $ScriptResult.system_optimization.sfc.success = $false + $ScriptResult.system_optimization.sfc.message = "SFC could not fix some files. See CBS.log for details." + $ScriptResult.system_optimization.sfc.files_repaired = -1 + } + -1 { # Often shows as 0xFFFFFFFF or -1 + $ScriptResult.system_optimization.sfc.success = $false + $ScriptResult.system_optimization.sfc.message = "SFC encountered an error. Check CBS.log for details." + } + default { + $ScriptResult.system_optimization.sfc.success = $false + $ScriptResult.system_optimization.sfc.message = "SFC completed with unexpected exit code: $ExitCode" + } + } + + Write-Log "SFC exit code: $ExitCode" -Level "INFO" + Write-Log "SFC message: $($ScriptResult.system_optimization.sfc.message)" -Level "INFO" + Write-Log "Files repaired: $($ScriptResult.system_optimization.sfc.files_repaired)" -Level "INFO" } catch { $ErrorMsg = "Failed to run SFC: $($_.Exception.Message)" - $ScriptResult.system_optimization.errors += $ErrorMsg + $ScriptResult.system_optimization.sfc.errors += $ErrorMsg Write-Log $ErrorMsg -Level "ERROR" } # Run DISM -Write-Log "Running DISM restore health..." -Level "INFO" +Write-Log "Running DISM /Online /Cleanup-Image /RestoreHealth..." -Level "INFO" try { - $DismResult = DISM /Online /Cleanup-Image /RestoreHealth 2>&1 | Out-String - $ScriptResult.system_optimization.dism_run = $true - $ScriptResult.system_optimization.dism_result = $DismResult.Trim() - Write-Log "DISM restore health completed." -Level "INFO" - Write-Log "DISM output: $DismResult" -Level "INFO" + $DismProcess = Start-Process -FilePath "DISM" -ArgumentList "/Online /Cleanup-Image /RestoreHealth" -NoNewWindow -Wait -PassThru -ErrorAction Stop + $ExitCode = $DismProcess.ExitCode + + $ScriptResult.system_optimization.dism.run = $true + $ScriptResult.system_optimization.dism.exit_code = $ExitCode + + # Parse exit codes + switch ($ExitCode) { + 0 { + $ScriptResult.system_optimization.dism.success = $true + $ScriptResult.system_optimization.dism.component_repaired = $true + $ScriptResult.system_optimization.dism.message = "DISM completed successfully. The component store was repaired." + } + 87 { + $ScriptResult.system_optimization.dism.success = $false + $ScriptResult.system_optimization.dism.message = "DISM failed. A parameter was invalid. Check the command syntax." + } + 3010 { + $ScriptResult.system_optimization.dism.success = $true + $ScriptResult.system_optimization.dism.component_repaired = $true + $ScriptResult.system_optimization.dism.message = "DISM completed successfully. A reboot is required." + } + 1726 { + $ScriptResult.system_optimization.dism.success = $false + $ScriptResult.system_optimization.dism.message = "DISM failed. The remote procedure call failed." + } + 1910 { + $ScriptResult.system_optimization.dism.success = $false + $ScriptResult.system_optimization.dism.message = "DISM failed. The specified image file could not be found." + } + default { + if ($ExitCode -ge 0 -and $ExitCode -le 100) { + $ScriptResult.system_optimization.dism.success = $true + $ScriptResult.system_optimization.dism.message = "DISM completed with exit code: $ExitCode" + } else { + $ScriptResult.system_optimization.dism.success = $false + $ScriptResult.system_optimization.dism.message = "DISM completed with unexpected exit code: $ExitCode" + } + } + } + + Write-Log "DISM exit code: $ExitCode" -Level "INFO" + Write-Log "DISM message: $($ScriptResult.system_optimization.dism.message)" -Level "INFO" + + if ($ExitCode -eq 3010) { + Write-Log "System reboot is recommended after DISM." -Level "WARNING" + } } catch { $ErrorMsg = "Failed to run DISM: $($_.Exception.Message)" - $ScriptResult.system_optimization.errors += $ErrorMsg + $ScriptResult.system_optimization.dism.errors += $ErrorMsg Write-Log $ErrorMsg -Level "ERROR" }