commit 3e3b73a26d220782a5eed19b30805433081e5ce8 Author: Crimson Date: Tue Sep 8 18:11:41 2026 +0000 Загрузить файлы в «/» diff --git a/README.md b/README.md new file mode 100644 index 0000000..d2a2087 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# winrep + +Простой инструмент для проверки и восстановления системных компонентов Windows 10 и Windows 11. + +## Использование + +1. Скачайте и распакуйте архив. +2. Запустите `winrep.cmd` двойным щелчком. +3. Подтвердите стандартный запрос UAC. +4. Не закрывайте окно до появления итогового результата. +5. После завершения откроется папка с логом. + +## Что делает + +`winrep` автоматически: + +- запрашивает права администратора; +- запускает `DISM.exe /Online /Cleanup-Image /RestoreHealth`; +- затем запускает `sfc.exe /scannow`; +- распознаёт основные результаты SFC на русской и английской Windows; +- отдельно распознаёт состояние, когда Windows требует перезагрузку перед повторным SFC; +- сохраняет основной лог на рабочий стол; +- при ошибке DISM сохраняет отдельный подробный DISM-лог; +- сообщает, требуется ли перезагрузка или повторная проверка. + +DISM запускается первым, поскольку он восстанавливает хранилище компонентов, которое SFC использует как источник исправных системных файлов. + +## Логи + +Основной файл: + +`Windows_Repair_YYYY-MM-DD_HH-MM-SS.log` + +Если DISM завершается ошибкой, дополнительно сохраняется: + +`Windows_Repair_YYYY-MM-DD_HH-MM-SS_DISM.log` + +## Совместимость + +- Windows 10 +- Windows 11 +- Windows PowerShell 5.1, входящий в стандартную поставку Windows + +## Важно + +Не выключайте и не перезагружайте компьютер во время выполнения проверки. + +Если SFC сообщает, что для завершения восстановления требуется перезагрузка, перезагрузите Windows и запустите `winrep.cmd` ещё раз. diff --git a/winrep.cmd b/winrep.cmd new file mode 100644 index 0000000..d0bf286 --- /dev/null +++ b/winrep.cmd @@ -0,0 +1,267 @@ +@echo off +setlocal EnableExtensions DisableDelayedExpansion + +:: ============================================================ +:: winrep - Windows System Repair Tool +:: Version 1.2 +:: Windows 10 / 11 +:: ============================================================ + +title Windows System Repair Tool v1.2 +chcp 65001 >nul 2>&1 + +:: --- Windows check --- +ver | findstr /i "Windows" >nul 2>&1 +if errorlevel 1 ( + echo. + echo [ОШИБКА] Этот файл предназначен только для Windows. + pause + exit /b 1 +) + +:: --- Administrator elevation --- +net session >nul 2>&1 +if not "%errorlevel%"=="0" ( + echo. + echo Требуются права администратора. + echo Сейчас появится стандартный запрос Windows UAC. + echo. + powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Start-Process -FilePath '%~f0' -Verb RunAs" + exit /b +) + +:: --- Desktop path --- +for /f "usebackq delims=" %%D in (`powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "[Environment]::GetFolderPath('Desktop')"`) do set "DESKTOP=%%D" +if not defined DESKTOP set "DESKTOP=%USERPROFILE%\Desktop" + +:: --- Timestamp --- +for /f "usebackq delims=" %%T in (`powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-Date -Format 'yyyy-MM-dd_HH-mm-ss'"`) do set "STAMP=%%T" + +set "LOG=%DESKTOP%\Windows_Repair_%STAMP%.log" +set "DISM_RAW=%TEMP%\winrep_dism_%STAMP%.log" +set "DISM_SAVED=%DESKTOP%\Windows_Repair_%STAMP%_DISM.log" +set "SFC_RAW=%TEMP%\winrep_sfc_%STAMP%.txt" + +:: --- OS information --- +for /f "tokens=2,*" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName 2^>nul ^| find /i "ProductName"') do set "PRODUCT=%%B" +for /f "tokens=2,*" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v DisplayVersion 2^>nul ^| find /i "DisplayVersion"') do set "DISPLAYVER=%%B" +for /f "tokens=2,*" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuildNumber 2^>nul ^| find /i "CurrentBuildNumber"') do set "BUILD=%%B" + +cls +echo ============================================================ +echo ПРОВЕРКА И ВОССТАНОВЛЕНИЕ WINDOWS +echo winrep v1.2 +echo ============================================================ +echo. +echo Будут выполнены: +echo 1. DISM /Online /Cleanup-Image /RestoreHealth +echo 2. SFC /scannow +echo. +echo Во время проверки НЕ закрывайте это окно. +echo Компьютером пользоваться можно, но не перезагружайте его. +echo. +echo Основной лог: +echo "%LOG%" +echo. +echo ============================================================ +echo. + +( + echo ============================================================ + echo WINDOWS SYSTEM REPAIR LOG + echo winrep v1.2 + echo ============================================================ + echo Start: %date% %time% + echo Computer: %COMPUTERNAME% + echo User: %USERNAME% + echo OS: %PRODUCT% + echo Version: %DISPLAYVER% + echo Build: %BUILD% + echo ============================================================ + echo. +) > "%LOG%" + +:: ------------------------------------------------------------ +:: STEP 1: DISM +:: ------------------------------------------------------------ +echo [1/2] Проверка хранилища компонентов Windows через DISM... +echo Это может занять довольно долго. +echo Проценты иногда надолго останавливаются на одном значении — +echo это нормально. +echo. + +( + echo ============================================================ + echo STEP 1 - DISM RestoreHealth + echo ============================================================ + echo Start: %date% %time% +) >> "%LOG%" + +DISM.exe /Online /Cleanup-Image /RestoreHealth /LogPath:"%DISM_RAW%" +set "DISM_RC=%errorlevel%" + +( + echo Exit code: %DISM_RC% + echo End: %date% %time% + echo. +) >> "%LOG%" + +set "DISM_STATUS=ERROR" +set "DISM_NEEDS_REBOOT=0" + +if "%DISM_RC%"=="0" ( + set "DISM_STATUS=OK" + del /q "%DISM_RAW%" >nul 2>&1 +) else if "%DISM_RC%"=="3010" ( + set "DISM_STATUS=OK_REBOOT" + set "DISM_NEEDS_REBOOT=1" + del /q "%DISM_RAW%" >nul 2>&1 +) else ( + copy /y "%DISM_RAW%" "%DISM_SAVED%" >nul 2>&1 + del /q "%DISM_RAW%" >nul 2>&1 +) + +echo. +if "%DISM_STATUS%"=="OK" ( + echo [OK] DISM завершён успешно. +) else if "%DISM_STATUS%"=="OK_REBOOT" ( + echo [OK] DISM завершён успешно, Windows запрашивает перезагрузку. +) else ( + echo [ВНИМАНИЕ] DISM завершился с кодом ошибки %DISM_RC%. + echo Проверка SFC всё равно будет выполнена. + echo Подробный DISM-лог сохранён отдельно. +) + +:: ------------------------------------------------------------ +:: STEP 2: SFC +:: ------------------------------------------------------------ +echo. +echo ------------------------------------------------------------ +echo. +echo [2/2] Проверка системных файлов через SFC... +echo. +echo Во время этой части процент выполнения не показывается, +echo чтобы корректно сохранить и распознать системный вывод. +echo Окно может несколько минут выглядеть неподвижным — это нормально. +echo. + +( + echo ============================================================ + echo STEP 2 - SFC SCANNOW + echo ============================================================ + echo Start: %date% %time% +) >> "%LOG%" + +sfc.exe /scannow > "%SFC_RAW%" 2>&1 +set "SFC_RC=%errorlevel%" + +:: SFC writes redirected output as UTF-16LE. +powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^ + "$t=[IO.File]::ReadAllText($env:SFC_RAW,[Text.Encoding]::Unicode); $u=New-Object Text.UTF8Encoding($false); [IO.File]::AppendAllText($env:LOG,[Environment]::NewLine+$t+[Environment]::NewLine,$u)" >nul 2>&1 + +:: Detect common SFC outcomes on Russian and English Windows. +set "SFC_STATUS=UNKNOWN" +for /f "usebackq delims=" %%S in (`powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^ + "$t=[IO.File]::ReadAllText($env:SFC_RAW,[Text.Encoding]::Unicode); if(($t -match 'Для завершения восстановления системы требуется перезагрузка') -or ($t -match 'system repair pending.*requires reboot') -or ($t -match 'Restart Windows and run sfc again')){'REBOOT_REQUIRED'} elseif(($t -match 'did not find any integrity violations') -or ($t -match 'не обнаружила нарушений целостности')){'CLEAN'} elseif(($t -match 'found corrupt files and successfully repaired them') -or ($t -match 'обнаружила поврежденные файлы и успешно\s+их восстановила') -or ($t -match 'обнаружила поврежденные файлы и успешно восстановила их')){'REPAIRED'} elseif(($t -match 'found corrupt files but was unable to fix some of them') -or ($t -match 'обнаружила поврежденные файлы, но не может восстановить некоторые из них') -or ($t -match 'не удалось восстановить некоторые из них')){'UNREPAIRED'} elseif(($t -match 'could not perform the requested operation') -or ($t -match 'не удается выполнить запрошенную операцию')){'FAILED'} else {'UNKNOWN'}"`) do set "SFC_STATUS=%%S" + +del /q "%SFC_RAW%" >nul 2>&1 + +( + echo SFC exit code: %SFC_RC% + echo SFC result: %SFC_STATUS% + echo End: %date% %time% + echo. +) >> "%LOG%" + +:: ------------------------------------------------------------ +:: SUMMARY +:: ------------------------------------------------------------ +( + echo ============================================================ + echo SUMMARY + echo ============================================================ + echo DISM: %DISM_STATUS% + echo DISM exit code: %DISM_RC% + echo SFC: %SFC_STATUS% + echo SFC exit code: %SFC_RC% + echo End: %date% %time% + echo ============================================================ +) >> "%LOG%" + +echo. +echo ============================================================ +echo ИТОГ +echo ============================================================ +echo. + +if "%DISM_STATUS%"=="OK" ( + echo DISM: хранилище компонентов проверено/восстановлено успешно. +) else if "%DISM_STATUS%"=="OK_REBOOT" ( + echo DISM: успешно, требуется перезагрузка. +) else ( + echo DISM: ошибка, код %DISM_RC%. +) + +if "%SFC_STATUS%"=="CLEAN" ( + echo SFC: повреждений системных файлов не найдено. +) else if "%SFC_STATUS%"=="REPAIRED" ( + echo SFC: повреждённые системные файлы найдены и исправлены. +) else if "%SFC_STATUS%"=="REBOOT_REQUIRED" ( + echo SFC: проверка отложена — Windows ожидает перезагрузку + echo после предыдущей операции восстановления. +) else if "%SFC_STATUS%"=="UNREPAIRED" ( + echo SFC: найдены повреждения, часть файлов восстановить не удалось. +) else if "%SFC_STATUS%"=="FAILED" ( + echo SFC: проверка не смогла завершиться штатно. +) else ( + echo SFC: результат не удалось автоматически распознать. + echo Код завершения SFC: %SFC_RC%. +) + +echo. + +set "NEEDS_REBOOT=0" +if "%DISM_NEEDS_REBOOT%"=="1" set "NEEDS_REBOOT=1" +if "%SFC_STATUS%"=="REPAIRED" set "NEEDS_REBOOT=1" +if "%SFC_STATUS%"=="REBOOT_REQUIRED" set "NEEDS_REBOOT=1" + +if "%NEEDS_REBOOT%"=="1" ( + echo РЕКОМЕНДАЦИЯ: перезагрузите компьютер. + echo После перезагрузки запустите winrep ещё раз для контрольной проверки. +) else if "%SFC_STATUS%"=="UNREPAIRED" ( + echo РЕКОМЕНДАЦИЯ: + echo 1. Перезагрузите компьютер. + echo 2. Запустите winrep ещё раз. + echo 3. Если проблема останется — передайте лог специалисту. +) else if "%SFC_STATUS%"=="FAILED" ( + echo РЕКОМЕНДАЦИЯ: перезагрузите компьютер и повторите проверку. +) else if "%SFC_STATUS%"=="UNKNOWN" ( + echo РЕКОМЕНДАЦИЯ: передайте основной лог специалисту. +) else if not "%DISM_STATUS%"=="OK" ( + echo РЕКОМЕНДАЦИЯ: передайте логи специалисту. +) else ( + echo Дополнительных действий по результатам этих проверок не требуется. +) + +echo. +echo Основной лог: +echo "%LOG%" + +if "%DISM_STATUS%"=="ERROR" ( + echo. + echo Подробный DISM-лог: + echo "%DISM_SAVED%" +) + +echo. +echo Нажмите любую клавишу, чтобы открыть папку с логами. +pause >nul + +explorer.exe /select,"%LOG%" >nul 2>&1 + +if "%SFC_STATUS%"=="REBOOT_REQUIRED" exit /b 6 +if "%SFC_STATUS%"=="UNREPAIRED" exit /b 2 +if "%SFC_STATUS%"=="FAILED" exit /b 3 +if "%SFC_STATUS%"=="UNKNOWN" exit /b 4 +if "%DISM_STATUS%"=="ERROR" exit /b 5 +exit /b 0