![]() |
中国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 |