-
This commit is contained in:
parent
f50bb72b14
commit
ed304aea44
1 changed files with 34 additions and 161 deletions
193
optimization.ps1
193
optimization.ps1
|
|
@ -1,36 +1,5 @@
|
|||
$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 {
|
||||
# Function to run process with true live streaming output
|
||||
function Start-ProcessWithLiveStreaming {
|
||||
param(
|
||||
[string]$FilePath,
|
||||
[string]$Arguments,
|
||||
|
|
@ -45,12 +14,39 @@ function Start-ProcessWithLiveOutput {
|
|||
if (Test-Path $stdoutFile) { Remove-Item $stdoutFile -ErrorAction SilentlyContinue }
|
||||
if (Test-Path $stderrFile) { Remove-Item $stderrFile -ErrorAction SilentlyContinue }
|
||||
|
||||
# Create file handles for immediate reading
|
||||
$fileStream = [System.IO.File]::Create($stdoutFile)
|
||||
|
||||
Write-Host "Starting $Name..."
|
||||
|
||||
# Start the process
|
||||
$process = Start-Process -FilePath $FilePath -ArgumentList $Arguments -NoNewWindow -Wait -PassThru -RedirectStandardOutput $stdoutFile -RedirectStandardError $stderrFile -ErrorAction Stop
|
||||
$process = Start-Process -FilePath $FilePath -ArgumentList $Arguments -NoNewWindow -PassThru -RedirectStandardOutput $stdoutFile -RedirectStandardError $stderrFile -ErrorAction Stop
|
||||
|
||||
# Read and display output live (file is written in real-time)
|
||||
# Read output while process runs
|
||||
$lastPosition = 0
|
||||
while (-not $process.HasExited) {
|
||||
Start-Sleep -Milliseconds 500
|
||||
|
||||
if (Test-Path $stdoutFile) {
|
||||
$currentLength = (Get-Item $stdoutFile).Length
|
||||
if ($currentLength -gt $lastPosition) {
|
||||
$bytesToRead = $currentLength - $lastPosition
|
||||
$stream = [System.IO.File]::OpenRead($stdoutFile)
|
||||
$stream.Seek($lastPosition, [System.IO.SeekOrigin]::Begin) | Out-Null
|
||||
$buffer = New-Object byte[] $bytesToRead
|
||||
$stream.Read($buffer, 0, $bytesToRead) | Out-Null
|
||||
$stream.Close()
|
||||
$text = [System.Text.Encoding]::UTF8.GetString($buffer)
|
||||
Write-Host $text -NoNewline
|
||||
$lastPosition = $currentLength
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Wait for process to complete
|
||||
$process.WaitForExit()
|
||||
|
||||
# Read any remaining output
|
||||
if (Test-Path $stdoutFile) {
|
||||
$content = Get-Content -Path $stdoutFile -Raw -ErrorAction SilentlyContinue
|
||||
if ($content) { Write-Host $content }
|
||||
|
|
@ -60,7 +56,7 @@ function Start-ProcessWithLiveOutput {
|
|||
if ($content) { Write-Host $content }
|
||||
}
|
||||
|
||||
# Return output and exit code
|
||||
# Get output for return
|
||||
$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 }
|
||||
|
|
@ -68,133 +64,10 @@ function Start-ProcessWithLiveOutput {
|
|||
# Cleanup
|
||||
Remove-Item $stdoutFile -ErrorAction SilentlyContinue
|
||||
Remove-Item $stderrFile -ErrorAction SilentlyContinue
|
||||
$fileStream.Close()
|
||||
|
||||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue