@echo off
rem set PATH=C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\DISM;%PATH%

set RecoverPath="D:\"
set ImagePath="Latest.wim"
set BackupFolder="C:\Users\Admin\Backup"

cd /d %BackupFolder%

TASKKILL /F /IM explorer.exe
if not exist %ImagePath% goto CleanupFailed

cls
echo Инициирована процедура восстановления системы.
echo ВНИМАНИЕ!
echo Восстановление системы уничтожит все Ваши данные на Вашем компьютере
echo и восстановит все программы до исходнодного состояния.
echo Если Вы передумали восстанавливать систему, закройте это окно и выключите
echo компьютер путем длительного удержания кнопки включения питания.
echo Если же Вы готовы начать процесс восстановления системы, нажмите ENTER 
echo или ПРОБЕЛ или другую клавишу на Ваше усмотрение.
pause >nul

cls
echo Запущен процесс восстановления системы.
echo Не производите никаких действий с компьютером до завершения процесса.
echo По завершению процесса будет запущена восстановленная система.
call :CleanupDrive %RecoverPath%
call :CleanupDrive %RecoverPath%
rem imagex /apply %ImagePath:~1,-1% 1 %RecoverPath:~1,-1%
dism /apply-image /imagefile:%ImagePath:~1,-1% /index:1 /ApplyDir:%RecoverPath:~1,-1%
call FixTileDB.cmd
rem bcdboot %RecoverPath%Windows
rem echo Восстановление завершено. Нажмите ENTER для запуска восстановленной системы.
rem pause >nul            
shutdown -r -t 01
goto :eof

:CleanupDrive
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1

  pushd %1
  if NOT %ERRORLEVEL%==0 goto CleanupFailed
  for /F "usebackq delims=" %%i in (`dir /A /B /L`) do call :ProcessRootEntry "%%i" 2>nul
  popd
goto :eof

:ProcessRootEntry
  if %1=="backup" goto :eof
  if %1=="Backup" goto :eof
  if %1=="BACKUP" goto :eof
  if %1=="system volume information" goto :eof
  if NOT %1=="users" call :RemoveEntry %1
  if %1=="users" call :ProcessUsers %1
goto :eof

:ProcessUsers
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1

  pushd %1
  if NOT %ERRORLEVEL%==0 goto CleanupFailed
  for /F "usebackq delims=" %%i in (`dir /A /B /L`) do call :ProcessUserEntry "%%i" 2>nul
  popd
goto :eof

:ProcessUserEntry
  if %1=="all users" call :RemoveEntry %1
  if %1=="default" call :RemoveEntry %1
  if %1=="default user" call :RemoveEntry %1
  if %1=="desktop.ini" call :RemoveEntry %1
  if %1=="все пользователи" call :RemoveEntry %1
  
  if exist %1 call :ProcessHomeFolder %1
goto :eof

:ProcessHomeFolder
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1

  pushd %1
  if NOT %ERRORLEVEL%==0 goto CleanupFailed
  for /F "usebackq delims=" %%i in (`dir /A /B /L`) do call :ProcessUserFolder "%%i" 2>nul
  for /F "usebackq delims=" %%i in (`dir /A /B /L ntuser.dat{*}.*`) do call :RemoveEntry "%%i" 2>nul
  for /F "usebackq delims=" %%i in (`dir /A /B /L .*`) do call :RemoveEntry "%%i" 2>nul
  popd
goto :eof

:ProcessUserFolder
  if %1=="appdata" call :ProcessAppData %1
  if %1=="application data" call :RemoveEntry %1
  if %1=="cookies" call :RemoveEntry %1
  if %1=="local settings" call :RemoveEntry %1
  if %1=="my documents" call :RemoveEntry %1
  if %1=="мои документы" call :RemoveEntry %1
  if %1=="nethood" call :RemoveEntry %1
  if %1=="printhood" call :RemoveEntry %1
  if %1=="recent" call :RemoveEntry %1
  if %1=="sendto" call :RemoveEntry %1
  if %1=="start menu" call :RemoveEntry %1
  if %1=="главное меню" call :RemoveEntry %1
  if %1=="templates" call :RemoveEntry %1
  if %1=="шаблоны" call :RemoveEntry %1
  if %1=="ntuser.dat" call :RemoveEntry %1
  if %1=="ntuser.ini" call :RemoveEntry %1
  if %1=="desktop.ini" call :RemoveEntry %1
  if %1=="ntuser.dat.log1" call :RemoveEntry %1
  if %1=="ntuser.dat.log2" call :RemoveEntry %1
  if %1=="program files" call :RemoveEntry %1
  if %1=="desktop" call :ProcessDesktop %1
goto :eof

:ProcessDesktop
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1

  pushd %1
  if NOT %ERRORLEVEL%==0 goto CleanupFailed
  for /F "usebackq delims=" %%i in (`dir /A /B /L *.lnk`) do call :RemoveEntry "%%i" 2>nul
  if exist "soft" call :RemoveEntry "soft"
  popd
goto :eof

:ProcessAppData
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1

  pushd %1
  if NOT %ERRORLEVEL%==0 goto CleanupFailed
  for /F "usebackq delims=" %%i in (`dir /A /B /L *.lnk`) do call :ProcessAppDataEntry "%%i" 2>nul
  popd
goto :eof

:ProcessAppDataEntry
  if %1=="Local" call :ProcessLocal %1
  if NOT %1=="Local" call :RemoveEntry %1
goto :eof

:ProcessLocal
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1

  pushd %1
  if NOT %ERRORLEVEL%==0 goto CleanupFailed
  for /F "usebackq delims=" %%i in (`dir /A /B /L *.lnk`) do call :ProcessLocalEntry "%%i" 2>nul
  popd
goto :eof

:ProcessLocalEntry
  if %1=="VirtualStore" goto :eof
  call :RemoveEntry %1
goto :eof

:RemoveEntry
  rem Reset permission for the entry
  TAKEOWN /F %1 >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q >nul 2>&1
 
  rem Try to remove as junction
  rmdir /q %1 >nul 2>&1

  if not exist %1 goto :eof

  rem Then, if failed, try to remove as subdirectory
  TAKEOWN /F %1 /R /D Y >nul 2>&1
  icacls %1 /grant *S-1-1-0:(F) /Q /T >nul 2>&1
  rmdir /s /q %1 >nul 2>&1

  rem And finally, try to remove as file/symlink
  if exist %1 del /a /q %1 >nul 2>&1
goto :eof

rem AND: 063 831 23 04

:CleanupFailed
cls
echo Возникла серьезная системная ощибка.
echo Невозможно произвести очистку диска. Выключите компьютер и обратитесь к администратору системы.
pause >nul
shutdown -s -f -t 60
exit 0
