@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