Board logo

标题: 妖怪了!!这是BUG吧??!! [打印本页]

作者: acoreq     时间: 2006-8-13 13:46    标题: 妖怪了!!这是BUG吧??!!

问题已经解决,谢谢:)

源代码在第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 ]
作者: acoreq     时间: 2006-8-13 14:10
又测试了多台机器的SCENARIO,一台装过PATCH,另外3台没有装
在装过PATCH的机器上RUN这个BATCH,结果success.log里显示本机机器名正确,但fail.log里一点东西都没有

似乎和第2)种可能无关,还是code问题吗?
不过我怎么看不出来问题的!!!  啊  疯掉了要。。。
作者: acoreq     时间: 2006-8-13 14:15    标题: UPDATE - 2

刚又发现,因为这个脚本是FOR MULTIPLE机器的
方法就是FOR /F %%i in (set) do (call ***.bat %%i)

发现set里的机器名顺序的不同  对于log文件的输出也有关系。。。
可变因素太多了  搞啊。。!!!
作者: qzwqzw     时间: 2006-8-13 14:26
那Patch NOT installed !有没有被输出呢?
如果有,那就是变量%strComputerName%的问题了。
否则就是reg那一句的问题了。
作者: acoreq     时间: 2006-8-13 14:43    标题: [源代码贴出]



  Quote:
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 ]
作者: chainliq     时间: 2006-8-13 20:00
GOOD,不错,!~`1
作者: acoreq     时间: 2006-8-13 20:16
唉  别不错不错呀  帮忙解决问题啊  和和
作者: 3742668     时间: 2006-8-14 22:06
完整的源码没看到,不过对于

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

的情况,可以查看 《帮助与支持》

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

-------摘自《帮助与支持》