批处理文件重复以前的工作程序

时间:2013-06-19 13:21:30

标签: batch-file

我的批处理脚本需要帮助。它运行得很好,但是后来当我想要运行它时,不断重复我之前显示的结果。例如,我上周执行了一个程序,呼叫运行echo“程序在上周开始运行”,当我今天试图通过echo“This is today”运行它。它运行并显示以前的结果“

PS代码现在完美运行.... @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

2 个答案:

答案 0 :(得分:7)

set minbytesize=6442450944中的数字很大 批处理只能处理32位数字。

但是当您引用数字时,将使用字符串比较函数,因此"9"的大小将大于"6442450944"

要获得正确的比较,您可以在数字前加零,在您的情况下,您知道第二个数字的长度很简单。

...
set "size=000000000000%size%"
set "size=%size:~-10%"
if "%size%" GEQ "%minbytesize%" (goto EXECUTE) 

它仍然是一个字符串比较,但它现在也适用于数字。

顺便说一下。这不是你的主要问题 设置ECHO ON以查看问题发生的位置可能是个好主意。

您使用的是什么时间格式?
如果它在一小时内使用带前缀的零,则会在set /a hh=%hh%+100

出现问题

答案 1 :(得分:4)

如果您在同一个控制台窗口中同时运行它,则问题可能是未初始化的变量,并且您将看到最后的结果。

要使用VBS检查数字,请尝试将其作为代码的第一部分。 留在最后goto :eof以阻止它通过比较落入以下代码。

检查决赛是否比较,以确保他们正在做你想要的。

@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