中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-27 05:51
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 妖怪了!!这是BUG吧??!! 查看 1,010 回复 7
楼 主 妖怪了!!这是BUG吧??!! 发表于 2006-08-13 13:46
初级用户
傻傻分不清楚...
积分 98
发帖 32
注册 2006-07-01 14:29
19年会员
UID 57838
来自 Shanghai
状态 离线
问题已经解决,谢谢:)

源代码在第5楼已贴出,请您认真阅读前几楼文章,有助于了解更多的问题现象
谢谢!
此贴怪异现象在XP/2003下测试得来


其实脚本很简单 就是判断注册表键值
IF EXIST success.log (
copy success.log #success.log
del success.log
)
IF EXIST fail.log (
copy fail.log #fail.log
del fail.log
)
cd. > success.log
cd. > fail.log
... ...
REG QUERY | FIND后加这个IF
if errorlevel 1 (
echo Patch NOT installed !
echo %strComputerName% >> fail.log
echo errlevel=%errorlevel%
set /a p1=p1+1
) else (
echo Patch installed :p
echo %strComputerName% >> success.log
echo errlevel=%errorlevel%
set /a p2=p2+1
)
妖怪问题来了!Lab里一台能找到键值,另一台找不到(脚本执行宿机),那应该fail.log和success.log里各有相应的计算机名。但是!。。。
fail.log里就是空空如也。。。success.log里却有正确的机器名
妖怪啊!!! 2个文件都存在,而且没有被打开
手工只打echo 1111>>fail.log却是OK的
试着把success.log改成fail.log,伊~ 新的fail.log能够被写入(说明ELSE以下code是好的)
把上面的fail.log改成success.log 还是不能正常写入进去(说明可能ELSE以上code有问题)

怀疑有2种可能
1) 上半部分code有问题(不过横看竖看都没问题啊。。。)
2) 和脚本执行的宿机有关,因为只有宿机不被纪录到

搞了好几个小时了 头大了 啊!!!!!
还望高手指点一二

[ Last edited by acoreq on 2006-8-13 at 20:54 ]
2 发表于 2006-08-13 14:10
初级用户
傻傻分不清楚...
积分 98
发帖 32
注册 2006-07-01 14:29
19年会员
UID 57838
来自 Shanghai
状态 离线
又测试了多台机器的SCENARIO,一台装过PATCH,另外3台没有装
在装过PATCH的机器上RUN这个BATCH,结果success.log里显示本机机器名正确,但fail.log里一点东西都没有

似乎和第2)种可能无关,还是code问题吗?
不过我怎么看不出来问题的!!! 啊 疯掉了要。。。
3 UPDATE - 2 发表于 2006-08-13 14:15
初级用户
傻傻分不清楚...
积分 98
发帖 32
注册 2006-07-01 14:29
19年会员
UID 57838
来自 Shanghai
状态 离线
刚又发现,因为这个脚本是FOR MULTIPLE机器的
方法就是FOR /F %%i in (set) do (call ***.bat %%i)

发现set里的机器名顺序的不同 对于log文件的输出也有关系。。。
可变因素太多了 搞啊。。!!!
4 发表于 2006-08-13 14:26 ·  中国 山西 运城 移动
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
那Patch NOT installed !有没有被输出呢?
如果有,那就是变量%strComputerName%的问题了。
否则就是reg那一句的问题了。
5 [源代码贴出] 发表于 2006-08-13 14:43
初级用户
傻傻分不清楚...
积分 98
发帖 32
注册 2006-07-01 14:29
19年会员
UID 57838
来自 Shanghai
状态 离线
Originally posted by acoreq at 2006-8-13 14:15:
刚又发现,因为这个脚本是FOR MULTIPLE机器的
方法就是FOR /F %%i in (set) do (call ***.bat %%i)

发现set里的机器名顺序的不同 对于log文件的输出也有关系。〠...

Patch NOT installed !有被输出

但不是%strComputerName%的问题,因为同样的变量在success.log里是输出的
也不是REG问题 因为REG判断后进入IF的ROUTE是正确的

刚又有一个重大发现!!
只有set里的最后一条纪录会被输出
不论它应该到fail.log还是success.log (发现越来越接近真相了,和和)

而且还发现,如果把IF那段改成下面那段(功能上应该一样的),注意这里用call了没用GOTO,怪事又来了
PATCH NOT INSTALLED!会显示2次,从而使p1 p2值产生错误,但是把call改成先前goto的结构 至少判断语句不会执行2次。。。 (没想法中。。。)

现决定贴出所有源代码,望斑竹或好心人帮忙研究一下!

谢谢!!!!
if errorlevel 1 (
call :notpatched
) else (
call :patched
)


:notpatched
echo Patch NOT installed
echo %strComputerName% >> fail.log
set /a p1=p1+1
goto nextloop

:patched
echo Patch installed
echo %strComputerName% >> success.log
set /a p2=p2+1
goto nextloop

:nextloop
::route to next PC validation

[ Last edited by acoreq on 2006-8-13 at 20:54 ]
6 发表于 2006-08-13 20:00 ·  中国 广西 贵港 电信
高级用户
★★
学无尽止
积分 635
发帖 244
注册 2006-04-15 05:07
20年会员
UID 53857
性别 男
来自 广西贵港
状态 离线
GOOD,不错,!~`1
7 发表于 2006-08-13 20:16
初级用户
傻傻分不清楚...
积分 98
发帖 32
注册 2006-07-01 14:29
19年会员
UID 57838
来自 Shanghai
状态 离线
唉 别不错不错呀 帮忙解决问题啊 和和
8 发表于 2006-08-14 22:06 ·  中国 湖北 荆门 电信
荣誉版主
★★★
积分 2,013
发帖 718
注册 2006-02-18 07:07
20年会员
UID 50550
状态 离线
完整的源码没看到,不过对于

而且还发现,如果把IF那段改成下面那段(功能上应该一样的),注意这里用call了没用GOTO,怪事又来了
PATCH NOT INSTALLED!会显示2次,从而使p1 p2值产生错误,但是把call改成先前goto的结构 至少判断语句不会执行2次。。。 (没想法中。。。)
的情况,可以查看 《帮助与支持》

:label
指定批处理程序要跳转到的标签。使用带有该参数的 call 命令可以创建新的批处理文件上下文,并将控制权交给指定标签后的语句。当首次遇到该批处理文件的末尾时(在跳转到标签后),控制权将交还给 CALL 语句后的语句。第二次遇到批处理文件的末尾,批脚本将被退出。对于可允许您从批处理脚本返回的 goto :eof 命令扩展,要了解关于它的说明,请参阅“相关主题”。


-------摘自《帮助与支持》
论坛跳转: