批处理运行时出现无效数字,怎么解决
下面的代码是将日期减少两年,然后运行一个软件,再把时间改回现在。因为这个软件已经过期,所以要用这种方法来启动软件。
之前都一直运行都好好的,就今天开始出现了这种问题,请问为什么,高手帮忙修正一下。
运行时出现
@echo off&setlocal ENABLEDELAYEDEXPANSION
set str=%date%
for /f "tokens=1 delims= " %%a in ("%date%") do set w=%%a
for /f "tokens=1,2* delims=-" %%a in ("%w%") do (set/a e=%%a-2
date !e!-%%b-%%c
start "" "d:\Progra~1\PhraseExpress\phraseexpress.exe"
call :ProcDelay 1000
date !str!
)
exit
:ProcDelay delayMSec_
setlocal enableextensions
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
:_procwaitloop
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
set /a diff_=%now_%-%start_%
if %diff_% LSS %1 goto _procwaitloop
endlocal & goto :EOF
问题出在时间延迟部分: set start_=%%h%%i%%j%%k 和 set now_=%%h%%i%%j%%k,当时间为凌晨0点到凌晨1点时,变量start_和now_就会成为0开头的数字。在set /a diff_=%now_%-%start_%时,set/a是根据运算的数字首为是否是0来判断进制的,0开头就不是10进制,而是8进制(因为0后不可能有x,所以不可能是16进制的),所以整个数字串中如果含有超过7的数字就出错了。
这个问题是批处理在设计时的缺陷造成的。同时,这个延迟部分还没有考虑跨0点的问题,虽然这个发生的几率很低,也就是当批处理是在23点59分50多秒开始运行后,延迟时间将产生重大误差。
考虑到实际使用中,你的延迟要求并不高,所以把call :ProcDelay 1000改成ping /n 10 127.1>nul。exit下面的全去掉。
Last edited by Hanyeguxing on 2010-4-9 at 02:20 ]