268 lines
12 KiB
Batchfile
268 lines
12 KiB
Batchfile
@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
|