中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 13:19
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理运行时出现无效数字,怎么解决 查看 705 回复 2
楼 主 批处理运行时出现无效数字,怎么解决 发表于 2010-04-09 01:01 ·  中国 广东 东莞 电信
初级用户
积分 30
发帖 30
注册 2008-09-19 14:07
17年会员
UID 126048
性别 男
状态 离线
批处理运行时出现无效数字,怎么解决

下面的代码是将日期减少两年,然后运行一个软件,再把时间改回现在。因为这个软件已经过期,所以要用这种方法来启动软件。
之前都一直运行都好好的,就今天开始出现了这种问题,请问为什么,高手帮忙修正一下。
运行时出现




@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
2 发表于 2010-04-09 02:09 ·  中国 吉林 延边朝鲜族自治州 延吉市 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
问题出在时间延迟部分: 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 ]
3 发表于 2010-04-09 10:11 ·  中国 广东 东莞 电信
初级用户
积分 30
发帖 30
注册 2008-09-19 14:07
17年会员
UID 126048
性别 男
状态 离线
谢谢,两边论坛都回复了,寒夜哥果然热心
论坛跳转: