@echo off setLocal EnableDelayedExpansion :: ------------------------ SET VARIABLES (don't touch) ---------------------------- set LauncherFolder="%userprofile%\Documents\Rockstar Games\Launcher" :: ------------------------ USER OPTIONS ---------------------------------------------- :: gamefolder will be replaced by actual game folder. BUT, you can put a completely custom path here, like "F:\my backups\gta_backup" , BUT please use " marks if your path has spaces! set backupfolder=gamefolder\_backup set use_checksum=true :: ---------------------------------------------------------------------------------------- :Start :GetGameFolder if exist %LauncherFolder% ( cd /d %LauncherFolder% if exist launcher.log ( for /f tokens^=2^ delims^=^" %%i in ('type launcher.log ^|find "GTA5.exe"') do set "exepath=%%i" if "!exepath!"=="" ( for /f "tokens=1 delims=" %%i in ('type launcher.log ^|find "Grand Theft Auto V"') do ( set "_p=%%i" set "_p=!_p:*Location: =!" set gamepath="!_p!" set "exepath=!_p!\gta5.exe" ) if "!gamepath!"=="" echo ERROR: COULD NOT DETECT GAMEFOLDER & pause & goto :eof ) else ( set gamepath="!exepath:\GTA5.exe=!" ) if exist !gamepath! ( set "gamefolder=!gamepath!" & echo Detected Game Folder !gamepath! & echo. ) else ( echo ERROR: COULD NOT DETECT GAMEFOLDER & pause & goto :eof ) ) ) else ( echo Warning: CAN'T FIND LAUNCHER FOLDER %LauncherFolder% & pause & goto :eof ) :GetVersion set exepath2=!exepath:\=\\! for /f "tokens=*" %%V in ( ' wmic datafile where "name='!exepath2!'" get version ' ) do ( for /F "delims=" %%A IN ("%%V") do ( if not "%%V"=="" ( if not "%%V"=="Version" set "version=%%V" ) ) ) set "version=%version: =%" if '!version!'=='' ( echo ERROR: COULD NOT DETECT VERSION & pause & goto :eof ) else ( echo Game Version: %version% ) :GetPlatform cd /d %LauncherFolder% if exist launcher.log ( for /f "tokens=*" %%i in ('type launcher.log ^|find "Running in Steam mode"') do set "Is_Steam=true" ) else ( echo ERROR: CAN'T FIND %cd%\launcher.log ) :SetFileList if defined is_steam ( set files_tocopy=GTA5.exe,GTAVLauncher.exe,steam_api64.dll,update\update.rpf ) else ( set files_tocopy=GTA5.exe,GTAVLauncher.exe,update\update.rpf ) :CheckBackupFolder set backupfolder=%backupfolder:gamefolder=!gamefolder!% set backupfolder=%backupfolder:"=% set backupfolder="%backupfolder%" if exist %backupfolder% ( echo. & echo Backup Folder %backupfolder% & echo. set bkup_count=0 set lastbkup_counter=0 cd /d %backupfolder% for /f "tokens=* delims= " %%A in ( ' dir /b /-p /o:-n /t:w *.* ' ) do ( set "var=" & for /f "delims=.0123456789" %%i in ('echo %%A') do set var=%%i if "!var!"=="" ( set "var=" set /a bkup_count=!bkup_count!+1 if !bkup_count!==1 set "last_backup=%%A" if !bkup_count!==2 set "prev_backup=%%A" if not "!backups!"=="" ( set "backups=!backups!,%%A") else ( set "backups=%%A") echo found backup %%A ) ) if !bkup_count!==0 echo NO BACKUPS HAVE BEEN FOUND. EXITING. & pause & goto :eof ) else ( echo ERROR: CAN'T FIND BACKUPFOLDER & pause & goto :eof ) :CheckEXE if %version%==%last_backup% ( set "do_downgrade=true" ) else ( if %version% GTR %last_backup% ( echo. & echo New version %version% , not yet backed up. Please backup first! & echo. & pause & goto :eof ) else ( if not exist %backupfolder%\%version% ( echo. & echo Old version %version% , no backup. Please back that up first! & echo. & pause & goto :eof) ) ) :Prompt echo. if defined do_downgrade ( set "msg=Downgrade from %version% to version %prev_backup%" ) else ( set "msg=Re-Update from %version% to version %last_backup%" ) set proceed= set /p "proceed=%msg% (Y/N)?" if not "!proceed!"=="" ( set "proceed=!proceed: =!" for /f "delims=yYnN" %%A in ('echo !proceed!') do goto :Prompt ) if /i !proceed!==y goto Process if /i !proceed!==n goto :eof goto :Prompt :Process if defined do_downgrade ( CALL :IterateFiles %prev_backup%) else ( CALL :IterateFiles %last_backup%) :Report if not "!copycount!"=="" ( echo. echo --------------------------------------------------------------------------------------- echo Copied !copycount! files: !copiedfiles! echo --------------------------------------------------------------------------------------- ) if not "!failcount!"=="" ( echo. echo --------------------------------------------------------------------------------------- echo FAILED TO COPY !failcount! files: !failedfiles! echo --------------------------------------------------------------------------------------- ) echo. pause goto :eof :IterateFiles echo. for %%F in (%files_tocopy%) do ( if %use_checksum%==true ( for /f "delims=" %%i in ('certutil -v -hashfile %gamefolder%\%%F MD5 ^| find /i /v "md5" ^| find /i /v "certutil"') do set "hash1=%%i" for /f "delims=" %%i in ('certutil -v -hashfile %backupfolder%\%1\%%F MD5 ^| find /i /v "md5" ^| find /i /v "certutil"') do set "hash2=%%i" if not !hash1!==!hash2! CALL :CopyFileFromBackup %1 %%F ) else ( CALL :CopyFileFromBackup %1 %%F) ) goto :eof :CopyFileFromBackup echo. & echo %2 copy %backupfolder%\%1\%2 %gamefolder%\%2 if "!errorlevel!"=="0" ( CALL :LogSuccess %2) else ( CALL :LogFailure %2) goto :eof :LogFailure if "!failcount!"=="" ( set "failcount=1" ) else ( set /a "failcount=!failcount!+1" ) if "!failedfiles!"=="" ( set "failedfiles=%1" ) else ( set "failedfiles=!failedfiles!, %1" ) goto :eof :LogSuccess if "!copycount!"=="" ( set "copycount=1" ) else ( set /a "copycount=!copycount!+1" ) if "!copiedfiles!"=="" ( set "copiedfiles=%1" ) else ( set "copiedfiles=!copiedfiles!, %1" ) goto :eof