Reputation: 143
Please I need help regarding my batch script. It was running perfectly, but later on when I wanted to run it keep repeating my previous result it displayed. eg I executed a program last week called to run echo " The program run at first last week", and by the time I tried to run it today by echo " This is today". It ran and displayed the previous result "
PS The code is working perfectly now.... @echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set file="C:\compress.gdb"
if not exist %file% goto :EOF
FOR %%A IN (%file%) DO set size=%%~zA
>"%temp%\math.vbs" echo Set objArgs = WScript.Arguments: num = objArgs(0) : result = 0
>>"%temp%\math.vbs" echo if num ^> 1073741824 then result=1
>>"%temp%\math.vbs" echo if num ^> 6442450944 then result=2
>>"%temp%\math.vbs" echo Wscript.echo result
for /f %%a in ('cscript /nologo "%temp%\math.vbs" %size% ') do set z=%%a
del "%temp%\math.vbs"
:: z will be 2 if %size% greater than 6442450944
:: z will be 1 if %size% greater than 1073741824
:: z will be 0 if %size% less than 1073741825
echo %z%
if %z% EQU 2 (goto EXECUTE)
if %z% EQU 0 (goto LOGOUT)
if %z% EQU 1 (goto LOGOUT)
goto :EOF
:EXECUTE
call "C:\Batch_Scripts_Sensitive\message.rtf" /max
"C:\Program Files\Embarcadero\InterBase\bin\isql" -i "C:\Batch_Scripts_Sensitive\Empty_Tables_2.sql" localhost:"C:\Program Files (x86)\GE Aviation\AB139 HGS\DB\compress.GDB" -user xxxxxxx -pass xxxxxxx
:: Create Date for Back up and Restore
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%
set year=%date:~-4%
echo year=%year%
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%
rem use this if you want to add seconds rem set datetimef=mydate_%year%_%month%_%day%_%hour%:%min%:%secs%
set datetimef=%year%_%month%_%day%_%hour%%min%
echo datetimef=%datetimef%
mkdir "C:\Monthly-gdb-restore\%datetimef%"
copy "C:\compress.gdb" "C:\Monthly-gdb-restore\%datetimef%" /Y
:: Delete empty folder in this location %Datetime%
for /f "delims=" %%d in ('dir "C:\Monthly-gdb-restore" /s /b /ad ^| sort /r') do rd "%%d"
forfiles /P "C:\Monthly-gdb-restore" /S /M *.gdb /D -7 /C "cmd /c del @PATH /q"
"C:\Program Files\Embarcadero\InterBase\bin\gbak" -b "C:\compress.gdb" "C:\compress.ibk" -user xxxxxxx -password xxxxxxx
set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%
set year=%date:~-4%
echo year=%year%
set month=%date:~3,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%
rem use this if you want to add seconds rem set datetimef=mydate_%year%_%month%_%day%_%hour%:%min%:%secs%
set datetimef=%year%_%month%_%day%_%hour%%min%
echo datetimef=%datetimef%
mkdir "C:\Monthly-ibk-backup\%datetimef%"
copy "C:\compress.ibk" "C:\Monthly-ibk-backup\%datetimef%" /Y
:: Delete empty folder in this location %Datetime%
for /f "delims=" %%d in ('dir "C:\Monthly-ibk-backup" /s /b /ad ^| sort /r') do rd "%%d"
forfiles /P "C:\Monthly-ibk-backup" /S /M *.ibk /D -7 /C "cmd /c del @PATH /q"
"C:\Program Files\Embarcadero\InterBase\bin\gbak" -R "C:\compress.ibk" "C:\compress.gdb" -user xxxxxxx -password xxxxxxx
goto FINISH
:LOGOUT
Echo " The size of the database file is not up to 6GB
goto :EOF
:FINISH
ECHO " The database for xxxxxxx was up to 6GB OR MORE, therefore proper backup and restoration has been performed.
goto :EOF
Upvotes: 1
Views: 365
Reputation: 41234
If you are running it in the same console window both times then the problem will likely be an uninitialised variable, and you are seeing the last result.
To use VBS to check the numbers then try this as the first part of your code.
Leave in the last goto :eof
to stop it falling through the compare into the following code.
Check the final if compares to be sure they are doing what you want.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set file="C:\Program Files (x86)\GE Aviation\AB139 HGS\DB\AW139 DB.gdb"
if not exist %file% goto :EOF
FOR %%A IN (%file%) DO set size=%%~zA
>"%temp%\math.vbs" echo Set objArgs = WScript.Arguments: num = objArgs(0) : result = 0
>>"%temp%\math.vbs" echo if num ^> 1073741824 then result=1
>>"%temp%\math.vbs" echo if num ^> 6442450944 then result=2
>>"%temp%\math.vbs" echo Wscript.echo result
for /f %%a in ('cscript /nologo "%temp%\math.vbs" %size% ') do set z=%%a
del "%temp%\math.vbs"
:: z will be 2 if %size% greater than 6442450944
:: z will be 1 if %size% greater than 1073741824
:: z will be 0 if %size% less than 1073741825
if %z% EQU 2 (goto EXECUTE)
if %z% EQU 1 (goto EXECUTE)
if %z% EQU 0 (goto LOGOUT)
goto :EOF
Upvotes: 4
Reputation: 82267
The number in set minbytesize=6442450944
is to big.
Batch can only handle 32bit numbers.
But as you quote the numbers the string compare function will be used, so a size of "9"
will be greater than "6442450944"
.
To get a correct compare you can prefix the number with zeros, in your case it's simple as you know how long the second number is.
...
set "size=000000000000%size%"
set "size=%size:~-10%"
if "%size%" GEQ "%minbytesize%" (goto EXECUTE)
It's still a string compare, but it's also correct for numbers now.
Btw. This will not be your main problem.
It could be a good idea to set ECHO ON
to see where your problem occurs.
What time format you are using?
If it's using prefixed zeros for the hour you got problems at set /a hh=%hh%+100
Upvotes: 7