diff --git a/Run WinRepair_Debug.bat b/Run WinRepair_Debug.bat new file mode 100644 index 0000000..187126f --- /dev/null +++ b/Run WinRepair_Debug.bat @@ -0,0 +1,28 @@ +@echo off +title WinRepair - DEBUG MODE +:: ═══════════════════════════════════════════════════════════════ +:: WinRepair Debug Launcher +:: Runs WinRepair with a VISIBLE console for error tracking +:: Debug log saved to WinRepair_Debug.log +:: ═══════════════════════════════════════════════════════════════ + +:: Check for admin rights +net session >nul 2>&1 +if %errorlevel% neq 0 ( + echo Requesting Administrator privileges... + powershell -NoProfile -Command "Start-Process cmd.exe -ArgumentList '/c \"\"%~f0\"\"' -Verb RunAs" + exit /b +) + +:: We are admin — change to script directory and run with visible console +pushd "%~dp0" +chcp 65001 >nul +echo ============================================ +echo WinRepair DEBUG MODE +echo Console output + WinRepair_Debug.log +echo ============================================ +echo. + +powershell.exe -NoProfile -NoExit -ExecutionPolicy Bypass -File ".\WinRepair_Debug.ps1" + +popd diff --git a/WinRepair_Debug.ps1 b/WinRepair_Debug.ps1 new file mode 100644 index 0000000..88f5ff5 --- /dev/null +++ b/WinRepair_Debug.ps1 @@ -0,0 +1,108 @@ +<# +.SYNOPSIS + WinRepair Debug Launcher +.DESCRIPTION + Runs WinRepair.ps1 as a CHILD PROCESS with full transcript logging, + visible console, and crash detection. The debug console stays open + even if WinRepair crashes or calls exit. + Debug log is saved to WinRepair_Debug.log in the same directory. +.NOTES + Run this via RunRepair_Debug.bat when troubleshooting issues. + The console window WILL remain open even after a crash. +#> + +# ============================================================================== +# DEBUG SETUP +# ============================================================================== +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$debugLog = Join-Path $scriptDir "WinRepair_Debug.log" +$errorLog = Join-Path $scriptDir "WinRepair_Error.log" +$mainScript = Join-Path $scriptDir "WinRepair.ps1" + +# Clear previous logs +"" | Out-File -FilePath $debugLog -Force +if (Test-Path $errorLog) { Remove-Item $errorLog -Force } + +Write-Host "==========================================================" -ForegroundColor Cyan +Write-Host "|| WinRepair - DEBUG MODE ||" -ForegroundColor Cyan +Write-Host "|| Logging to: WinRepair_Debug.log ||" -ForegroundColor Cyan +Write-Host "|| This window stays open after crashes ||" -ForegroundColor Cyan +Write-Host "==========================================================" -ForegroundColor Cyan +Write-Host "" + +# Start transcript +Start-Transcript -Path $debugLog -Append | Out-Null + +Write-Host "[DEBUG] Script directory: $scriptDir" -ForegroundColor Yellow +Write-Host "[DEBUG] Main script: $mainScript" -ForegroundColor Yellow +Write-Host "[DEBUG] PowerShell version: $($PSVersionTable.PSVersion)" -ForegroundColor Yellow +Write-Host "[DEBUG] OS: $([System.Environment]::OSVersion.VersionString)" -ForegroundColor Yellow +Write-Host "[DEBUG] Running as Admin: $(([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))" -ForegroundColor Yellow +Write-Host "[DEBUG] Date: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Yellow +Write-Host "" + +# ============================================================================== +# LAUNCH WINREPAIR AS A CHILD PROCESS +# This is the key difference: Start-Process creates a SEPARATE process, +# so even if WinRepair calls "exit 1", only the child dies. +# This debug console survives no matter what. +# ============================================================================== +Write-Host "[DEBUG] Launching WinRepair.ps1 as child process..." -ForegroundColor Green +Write-Host "[DEBUG] -----------------------------------------------" -ForegroundColor DarkGray +Write-Host "" + +$startTime = Get-Date + +# Set env var so WinRepair.ps1 skips hiding the console window +$env:WINREPAIR_DEBUG = "1" + +$childProc = Start-Process -FilePath "powershell.exe" ` + -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$mainScript`" -DebugMode" ` + -PassThru -NoNewWindow + +# Wait for the child process to finish +$childProc.WaitForExit() + +$exitCode = $childProc.ExitCode +$elapsed = (Get-Date) - $startTime + +Write-Host "" +Write-Host "[DEBUG] -----------------------------------------------" -ForegroundColor DarkGray + +if ($exitCode -eq 0) { + Write-Host "[DEBUG] WinRepair exited normally (code 0)" -ForegroundColor Green +} else { + Write-Host "[DEBUG] WinRepair CRASHED with exit code: $exitCode" -ForegroundColor Red +} + +Write-Host "[DEBUG] Duration: $($elapsed.ToString('mm\:ss'))" -ForegroundColor Yellow + +# Check for error log from WinRepair's trap handler +if (Test-Path $errorLog) { + $errorContent = Get-Content $errorLog -Raw + if ($errorContent -and $errorContent.Trim() -ne "") { + Write-Host "" + Write-Host "==========================================================" -ForegroundColor Red + Write-Host " CRASH DETAILS (from WinRepair_Error.log) " -ForegroundColor Red + Write-Host "==========================================================" -ForegroundColor Red + Write-Host "" + Write-Host $errorContent -ForegroundColor Yellow + Write-Host "" + Write-Host "==========================================================" -ForegroundColor Red + } +} else { + if ($exitCode -ne 0) { + Write-Host "" + Write-Host "[DEBUG] No WinRepair_Error.log found. The crash may have" -ForegroundColor Red + Write-Host "[DEBUG] bypassed the error handler (e.g. .NET exception)." -ForegroundColor Red + } +} + +Write-Host "" +Write-Host "[DEBUG] Full debug log saved to: $debugLog" -ForegroundColor Yellow + +Stop-Transcript -ErrorAction SilentlyContinue | Out-Null + +Write-Host "" +Write-Host "Press any key to close this window..." -ForegroundColor Cyan +$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")