中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 12:30
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » 批处理运行时出现无效数字,怎么解决
可打印版本  704 / 2
第1楼 linjuming 发表于 2010-04-09 01:01
初级用户 发帖 30 积分 30
批处理运行时出现无效数字,怎么解决
批处理运行时出现无效数字,怎么解决

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




@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楼 Hanyeguxing 发表于 2010-04-09 02:09
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
问题出在时间延迟部分: 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楼 linjuming 发表于 2010-04-09 10:11
初级用户 发帖 30 积分 30
谢谢,两边论坛都回复了,寒夜哥果然热心
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023