$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" = @() } } } $tempPath = $env:TEMP # Function to run process with live output using job function Start-ProcessWithLiveOutput { param( [string]$FilePath, [string]$Arguments, [string]$Name ) $stdoutFile = "$tempPath\${Name}_stdout.txt" $stderrFile = "$tempPath\${Name}_stderr.txt" # Clean up old files if (Test-Path $stdoutFile) { Remove-Item $stdoutFile -Force -ErrorAction SilentlyContinue } if (Test-Path $stderrFile) { Remove-Item $stderrFile -Force -ErrorAction SilentlyContinue } Write-Host "Starting $Name..." # Start process $process = Start-Process -FilePath $FilePath -ArgumentList $Arguments -NoNewWindow -PassThru -RedirectStandardOutput $stdoutFile -RedirectStandardError $stderrFile -ErrorAction Stop # Start background job to read output while process runs $job = Start-Job -ScriptBlock { param($stdoutFile, $stderrFile, $processId) $lastStdoutPos = 0 $lastStderrPos = 0 while ($true) { # Check if process still running $proc = Get-Process -Id $processId -ErrorAction SilentlyContinue if (-not $proc) { break } # Read stdout if (Test-Path $stdoutFile) { $stdoutSize = (Get-Item $stdoutFile).Length if ($stdoutSize -gt $lastStdoutPos) { $content = Get-Content -Path $stdoutFile -Raw if ($content) { $newContent = $content.Substring($lastStdoutPos) if ($newContent) { Write-Host $newContent -NoNewline } } $lastStdoutPos = $stdoutSize } } # Read stderr if (Test-Path $stderrFile) { $stderrSize = (Get-Item $stderrFile).Length if ($stderrSize -gt $lastStderrPos) { $content = Get-Content -Path $stderrFile -Raw if ($content) { $newContent = $content.Substring($lastStderrPos) if ($newContent) { Write-Host $newContent -NoNewline } } $lastStderrPos = $stderrSize } } Start-Sleep -Milliseconds 200 } } -ArgumentList $stdoutFile, $stderrFile, $process.Id # Wait for process to complete $process.WaitForExit() # Wait for job to finish $job | Wait-Job | Out-Null Receive-Job -Job $job | Out-Null Remove-Job -Job $job -Force -ErrorAction SilentlyContinue # Read final output $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 -Force -ErrorAction SilentlyContinue Remove-Item $stderrFile -Force -ErrorAction SilentlyContinue return @{ ExitCode = $process.ExitCode Output = $outputText } } # Run CHKDSK Write-Host "==========================================" Write-Host "Running CHKDSK with /R option..." 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 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 } switch ($ChkdskExitCode) { 0 { $ScriptResult.system_optimization.chkdsk.success = $true; $ScriptResult.system_optimization.chkdsk.message = "CHKDSK completed successfully." } 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." } 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." } default { $ScriptResult.system_optimization.chkdsk.success = $false; $ScriptResult.system_optimization.chkdsk.message = "CHKDSK completed with exit code: $ChkdskExitCode" } } Write-Host "CHKDSK exit code: $ChkdskExitCode" } 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 switch ($ExitCode) { 0 { $ScriptResult.system_optimization.sfc.success = $true; $ScriptResult.system_optimization.sfc.message = "SFC completed successfully."; $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." } 3 { $ScriptResult.system_optimization.sfc.success = $false; $ScriptResult.system_optimization.sfc.message = "SFC could not fix some files."; $ScriptResult.system_optimization.sfc.files_repaired = -1 } -1 { $ScriptResult.system_optimization.sfc.success = $false; $ScriptResult.system_optimization.sfc.message = "SFC encountered an error." } default { $ScriptResult.system_optimization.sfc.success = $false; $ScriptResult.system_optimization.sfc.message = "SFC completed with exit code: $ExitCode" } } Write-Host "SFC exit code: $ExitCode" } 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 switch ($ExitCode) { 0 { $ScriptResult.system_optimization.dism.success = $true; $ScriptResult.system_optimization.dism.component_repaired = $true; $ScriptResult.system_optimization.dism.message = "DISM completed successfully." } 87 { $ScriptResult.system_optimization.dism.success = $false; $ScriptResult.system_optimization.dism.message = "DISM failed. A parameter was invalid." } 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." } 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 exit code: $ExitCode" } } } Write-Host "DISM exit code: $ExitCode" } 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