Now, back to the merits. It took me few minutes to get it working. This is the older one (DeleteBackup references are TODOs):
@echo off echo. echo 1 Query backup info echo 2 Remove backup :loop echo. set ch=&set/p ch=ú if "%ch%"=="1" call:QueryBackupInfo if "%ch%"=="2" call:DeleteBackup goto loop :QueryBackupInfo for /f %%A in ('dir/b %windir%\grestore*.cmd') do ( call:MakeSemicolonSeparatedVariable %%A scriptlist ) for %%A in (%scriptlist%) do ( call:GetBackupInfo %%A call:PrintBackupInfo %%A ) exit/b0 set _>>getbkinfo.var pause goto:eof :MakeSemicolonSeparatedVariable set var=%% %2 %% set var=%var: =% if defined %2 ( call set %2=%var%;%1 ) else ( set %2=%1 ) set var= exit/b0 :GetBackupInfo for /f "tokens=6" %%B in ('type "%windir%\%1"^|find "This is auto-generated GTweak"') do ( set gver=%%B ) for /f "tokens=3*" %%B in ('type "%windir%\%1"^|find "Generated:"') do ( set gdatecreated=%%B %%C ) for /f "tokens=3 delims=\)" %%B in ('type "%windir%\%1"^|find "for %%%%A in (%%drive%%:"') do ( call:CheckBackupFile %1 %%B ) for /f "tokens=*" %%G in ('set %bid%') do ( if "%%G" NEQ "" set/a BackedUpFilesCount+=1 ) for /f "tokens=4 delims=.=" %%G in ('set %bid%') do ( if "%%G"=="1" ( set/a _%bid%.SUM_OF_VALID_FILESIZE_MATCHES+=1 ) ) for /f "tokens=3 delims=.=" %%A in ('set _%bid%.SUM_OF_VALID_FILESIZE_MATCHES') do ( if "%%A"=="%BackedUpFilesCount%" ( set _%bid%.BACKUP_VALID=1 ) else ( set _%bid%.BACKUP_VALID=0 ) ) for /f "tokens=2 delims=." %%G in ('set %bid%') do ( set %bid%.%%G.IsValid= ) for %%A in ( _%bid%.SUM_OF_VALID_FILESIZE_MATCHES BackedUpFilesCount file SizeGotFromScript SizeNow ) do set %%A= exit/b0 :PrintBackupInfo echo. echo Backup Id: %bid% echo. echo Restoration script path: %windir%\%1 echo Program version: %gver% echo Possible date created: %gdatecreated% for /f "tokens=3 delims=.=" %%A in ('set _%bid%.BACKUP_VALID') do ( if "%%A"=="1" ( echo Backup valid ^(supposedly^): yes ) if "%%A"=="0" ( echo Backup valid ^(supposedly^): no ) if "%%A" NEQ "1" ( if "%%A" NEQ "0" ( echo EXCEPTION OCCURED: [%%A] ) ) ) echo ///////////////////////////////////////////////////////////////////////// set gver=&set gdatecreated=&set bid= exit/b0 :CheckBackupFile for /f "tokens=1,3 delims=_" %%C in ('echo %2') do ( set bid=%%C set file=%%D ) for %%C in (%windir%\%2) do ( for /f "tokens=8" %%D in ('type "%windir%\%1"^|find "%2)"') do ( call:CompareSizes "%%~zC" %%D ) ) exit/b0 :CompareSizes set SizeNow=%1 set SizeGotFromScript=%3 if "%SizeNow%"=="%SizeGotFromScript%" ( set %bid%.%file%.IsValid=1 ) else ( set %bid%.%file%.IsValid=0 ) exit/b0
I decided to cease nesting
FIND
and TYPE
commands in FOR
loops. It was a bit more time-consuming to get it working, but it paid off.@echo off echo. echo 1 Query backup info echo 2 Remove backup :loop echo. set ch=&set/p ch=ú if "%ch%"=="1" call:QueryBackupInfo if "%ch%"=="2" call:DeleteBackup goto loop :QueryBackupInfo for /f %%A in ('dir/b %windir%\grestore*.cmd') do ( call:MakeSemicolonSeparatedVariable %%A scriptlist ) for %%A in (%scriptlist%) do ( call:GetBackupInfo %%A call:PrintBackupInfo %%A ) exit/b0 set _>>getbkinfo.var pause goto:eof :MakeSemicolonSeparatedVariable set var=%% %2 %% set var=%var: =% if defined %2 ( call set %2=%var%;%1 ) else ( set %2=%1 ) set var= exit/b0 :GetBackupInfo call:RetrieveVersion %1 call:RetrieveCreationDate %1 for /f "tokens=1-13 delims=\() " %%B in (%windir%\%1) do (if "%%B %%D %%F"=="for in Windows" (call:CompareSizes %%G %%K)) for /f "tokens=*" %%G in ('set %bid%') do (if "%%G" NEQ "" set/a BackedUpFilesCount+=1) for /f "tokens=4 delims=.=" %%G in ('set %bid%') do (if "%%G"=="1" (set/a _%bid%.SUM_OF_VALID_FILESIZE_MATCHES+=1)) for /f "tokens=3 delims=.=" %%A in ('set _%bid%.SUM_OF_VALID_FILESIZE_MATCHES') do (if "%%A"=="%BackedUpFilesCount%" (set _%bid%.BACKUP_VALID=1) else (set _%bid%.BACKUP_VALID=0)) for /f "tokens=2 delims=." %%G in ('set %bid%') do (set %bid%.%%G.IsValid=) for %%A in ( _%bid%.SUM_OF_VALID_FILESIZE_MATCHES BackedUpFilesCount hive ) do (set %%A=) exit/b0 :PrintBackupInfo echo. echo Backup Id: %bid% echo. echo Restoration script path: %windir%\%1 echo Program version: %gver% echo Possible date created: %gdatecreated% for /f "tokens=3 delims=.=" %%A in ('set _%bid%.BACKUP_VALID') do ( if "%%A"=="1" (echo Backup valid ^(supposedly^): yes) if "%%A"=="0" (echo Backup valid ^(supposedly^): no) if "%%A" NEQ "1" (if "%%A" NEQ "0" (echo EXCEPTION OCCURED: [%%A])) ) echo ///////////////////////////////////////////////////////////////////////// set gver=&set gdatecreated=&set bid= exit/b0 :CompareSizes for /f "tokens=1,3 delims=_" %%A in ("%1") do (set bid=%%A&set hive=%%B) set CommitedSize=%3 set CommitedSize=%CommitedSize:"=% for %%A in (%windir%\%1) do (if "%%~zA"=="%CommitedSize%" (set %bid%.%hive%.IsValid=1) else (set %bid%.%hive%.IsValid=0)) set CommitedSize= set hive= exit/b0 :RetrieveVersion for /f "tokens=1-5,6" %%B in (%windir%\%1) do (if "%%B %%C %%D %%E %%F"=="rem This is auto-generated GTweak" (set gver=%%G&exit/b0)) set gver=UNKNOWN exit/b0 :RetrieveCreationDate for /f "tokens=1-2,*" %%B in (%windir%\%1) do (if "%%B %%C"=="rem Generated:" (set gdatecreated=%%D&exit/b0)) set gdatecreated=UNKNOWN exit/b0
Results? Previous (old) version needed 57 seconds to verify 140 registry backups, newer - only 13 seconds. A bit more work and 4x faster script an award. Give it a try, but it is reasonable only, when you have at least 100 backups, then the effect is truly noticeable. Newer script relies on internals of Command Prompt, not even uses
TYPE
command.Above scripts are on early (alpha) stage of development, use entirely on your own risk.
No comments:
Post a Comment