$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-Host "Running CHKDSK with /R option..." Write-Host "Note: If volume is in use, CHKDSK will be scheduled for next reboot." try { # Use cmd /c echo Y | to automatically answer "Y" to any prompts $ChkdskOutput = cmd /c "echo Y | chkdsk C: /R" 2>&1 | Out-String $ChkdskExitCode = $LASTEXITCODE $ScriptResult.system_optimization.chkdsk.run = $true $ScriptResult.system_optimization.chkdsk.exit_code = $ChkdskExitCode # Parse output for scheduled check if ($ChkdskOutput -match "will be checked on next boot|Chkdsk cannot run because the volume is in use") { $ScriptResult.system_optimization.chkdsk.reboot_required = $true Write-Host "CHKDSK scheduled for next system restart." } # Parse exit codes switch ($ChkdskExitCode) { 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 if (-not $ScriptResult.system_optimization.chkdsk.reboot_required) { $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 if (-not $ScriptResult.system_optimization.chkdsk.reboot_required) { $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 exit code: $ChkdskExitCode" } } Write-Host "CHKDSK exit code: $ChkdskExitCode" Write-Host "CHKDSK message: $($ScriptResult.system_optimization.chkdsk.message)" Write-Host "CHKDSK output: $ChkdskOutput" if ($ScriptResult.system_optimization.chkdsk.reboot_required) { Write-Host "System reboot is required to complete CHKDSK." } } catch { $ErrorMsg = "Failed to run CHKDSK: $($_.Exception.Message)" $ScriptResult.system_optimization.chkdsk.errors += $ErrorMsg Write-Host $ErrorMsg } # Run SFC Write-Host "Running System File Checker (SFC /scannow)..." try { $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-Host "SFC exit code: $ExitCode" Write-Host "SFC message: $($ScriptResult.system_optimization.sfc.message)" Write-Host "Files repaired: $($ScriptResult.system_optimization.sfc.files_repaired)" } catch { $ErrorMsg = "Failed to run SFC: $($_.Exception.Message)" $ScriptResult.system_optimization.sfc.errors += $ErrorMsg Write-Host $ErrorMsg } # Run DISM Write-Host "Running DISM /Online /Cleanup-Image /RestoreHealth..." try { $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-Host "DISM exit code: $ExitCode" Write-Host "DISM message: $($ScriptResult.system_optimization.dism.message)" if ($ExitCode -eq 3010) { Write-Host "System reboot is recommended after DISM." } } catch { $ErrorMsg = "Failed to run DISM: $($_.Exception.Message)" $ScriptResult.system_optimization.dism.errors += $ErrorMsg Write-Host $ErrorMsg } Write-Host "System optimization section completed." "" | Out-File -FilePath $LogFile -Append -Encoding UTF8