$ScriptResult = @{ success = $true system_optimization = @{ "chkdsk" = @{ "run" = $false "success" = $false "exit_code" = $null "message" = "" "reboot_required" = $false "diskSpace" = "" "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" = @() } } } # Function to run process with live output function Start-ProcessWithLiveOutput { param( [string]$FilePath, [string]$Arguments, [string]$Name ) $tempPath = $env:TEMP $stdoutFile = "$tempPath\${Name}_stdout.txt" $stderrFile = "$tempPath\${Name}_stderr.txt" # Clean up old files if (Test-Path $stdoutFile) { Remove-Item $stdoutFile -ErrorAction SilentlyContinue } if (Test-Path $stderrFile) { Remove-Item $stderrFile -ErrorAction SilentlyContinue } Write-Host "Starting $Name..." # Start the process $process = Start-Process -FilePath $FilePath -ArgumentList $Arguments -NoNewWindow -Wait -PassThru -RedirectStandardOutput $stdoutFile -RedirectStandardError $stderrFile -ErrorAction Stop # Read and display output live (file is written in real-time) if (Test-Path $stdoutFile) { $content = Get-Content -Path $stdoutFile -Raw -ErrorAction SilentlyContinue if ($content) { Write-Host $content } } if (Test-Path $stderrFile) { $content = Get-Content -Path $stderrFile -Raw -ErrorAction SilentlyContinue if ($content) { Write-Host $content } } # Return output and exit code $outputText = "" if (Test-Path $stdoutFile) { $outputText = Get-Content -Path $stdoutFile -Raw -ErrorAction SilentlyContinue } if (Test-Path $stderrFile) { $outputText += Get-Content -Path $stderrFile -Raw -ErrorAction SilentlyContinue } # Cleanup Remove-Item $stdoutFile -ErrorAction SilentlyContinue Remove-Item $stderrFile -ErrorAction SilentlyContinue return @{ ExitCode = $process.ExitCode Output = $outputText } } # Run CHKDSK Write-Host "==========================================" Write-Host "Running CHKDSK with /R option..." Write-Host "Note: If volume is in use, CHKDSK will be scheduled for next reboot." Write-Host "==========================================" try { $result = Start-ProcessWithLiveOutput -FilePath "cmd" -Arguments "/c echo Y | chkdsk C: /R" -Name "chkdsk" $ChkdskExitCode = $result.ExitCode $outputText = $result.Output $ScriptResult.system_optimization.chkdsk.run = $true $ScriptResult.system_optimization.chkdsk.exit_code = $ChkdskExitCode # Parse output if ($outputText -match "will be checked on next boot|Chkdsk cannot run because the volume is in use") { $ScriptResult.system_optimization.chkdsk.reboot_required = $true } # Parse disk space if ($outputText -match "(\d+) bytes in (\d+) data streams recovered") { $bytesRecovered = [int64]$matches[1] $ScriptResult.system_optimization.chkdsk.diskSpace = "{0:N2} MB" -f ($bytesRecovered / 1MB) } # 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; $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 exit code: $ChkdskExitCode" } } Write-Host "CHKDSK exit code: $ChkdskExitCode" Write-Host "CHKDSK message: $($ScriptResult.system_optimization.chkdsk.message)" } catch { $ErrorMsg = "Failed to run CHKDSK: $($_.Exception.Message)" $ScriptResult.system_optimization.chkdsk.errors += $ErrorMsg Write-Host $ErrorMsg } # Run SFC Write-Host "==========================================" Write-Host "Running System File Checker (SFC /scannow)..." Write-Host "==========================================" try { $result = Start-ProcessWithLiveOutput -FilePath "sfc" -Arguments "/scannow" -Name "sfc" $ExitCode = $result.ExitCode $outputText = $result.Output $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 { $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)" } catch { $ErrorMsg = "Failed to run SFC: $($_.Exception.Message)" $ScriptResult.system_optimization.sfc.errors += $ErrorMsg Write-Host $ErrorMsg } # Run DISM Write-Host "==========================================" Write-Host "Running DISM /Online /Cleanup-Image /RestoreHealth..." Write-Host "==========================================" try { $result = Start-ProcessWithLiveOutput -FilePath "DISM" -Arguments "/Online /Cleanup-Image /RestoreHealth" -Name "dism" $ExitCode = $result.ExitCode $outputText = $result.Output $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)" } catch { $ErrorMsg = "Failed to run DISM: $($_.Exception.Message)" $ScriptResult.system_optimization.dism.errors += $ErrorMsg Write-Host $ErrorMsg } # Output JSON result Write-Host "==========================================" Write-Host "System optimization section completed." Write-Host "==========================================" $result = $ScriptResult | ConvertTo-Json -Compress -Depth 10 Write-Output $result