找回密码
 加入
搜索
查看: 5119|回复: 8

[AU3基础] (已解决)while循环进入死循环,请大家帮我看看问题出在哪里~~谢谢

  [复制链接]
发表于 2010-12-13 16:58:14 | 显示全部楼层 |阅读模式
本帖最后由 boy007zz 于 2010-12-16 15:10 编辑

我写了一个while循环调用EXCEL读取DBF库COUNT值的函数,可却进入了死循环,且只能读取i=1的值~大家帮我看看吧~~谢谢
我的程序:
#include <Excel.au3>
#include <Array.au3>
#include<file.au3>
Dim $i=1
Dim $B=0
Dim $C
Dim $FLAG = True
Global Const $xlUp = -4162    
$FilePath=IniRead(@ScriptDir&"\dbfconfig.ini","DBF","FilePath" & $i,"NotFound")
$FIleName=IniRead(@ScriptDir&"\dbfconfig.ini","DBF","FileName" & $i,"NotFound")
local $oexcel = _ExcelBookOpen($FilePath,0) ;参数0为静默打开DBF文件
$ColumnNum= $oExcel.Sheets($FileName).Range("A65536").End($xlUp).Row -1; A列第65536行之上的最后有数据的单元格所在行数
$REG=IniRead(@ScriptDir & "\dbfconfig.ini","InitDBFData","REGKEY" & $i,"NOTFOUND")
$KEYNAME=IniRead(@ScriptDir & "\dbfconfig.ini","InitDBFData","KEYNAME" & $i,"NOTFOUND")

Func readdbf (ByRef $oexcel,ByRef $FilePath,ByRef $FileName,ByRef $ColumnNum);自定义函数--读取dbf库count值
        
EndFunc

While(1)
;判断是否没有任何配置项
;如果配置文件为空,即$B=0,则记录日志后退出循环,结束程序
;如果配置文件不为空,即$B<>0表示已经执行完毕所有配置正常,则记录日志后退出循环,结束程序
;如果缺少一个或者多个配置项,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
If ($FileName= "NotFound" And $FilePath= "NotFound" ) Then
        If( $B=0 And $i=1 )Then
        _FileWriteLog(@ScriptDir & "\DBF.log","配置文件无任何配置,无法验证DBF库否清空")        
        EndIf                
        ExitLoop
        EndIf                
                
        ;如果缺少一个或者多个配置项,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
        If ($FileName= "NotFound" Or $FilePath= "NotFound" ) Then
        _FileWriteLog(@ScriptDir & "\DBF.log","缺少部分配置项,"&$FilePath&$i&"库清空失败。")
        $i += 1                                
        ContinueLoop
        EndIf 
        
            ;如果一个或者多个配置项的值为空,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
         If ($FileName= ""Or $FilePath= "") Then
              _FileWriteLog(@ScriptDir & "\DBF.log","配置项的值不能为空,Disk"&$FilePath&$i&"库清空失败。")
             $i += 1        
             ContinueLoop
             Else     
             $C=readdbf($oexcel,$FilePath,$FileName,$ColumnNum)
             If $C=0 Then 
        _FileWriteLog(@ScriptDir & "\DBF.log",$FileName&"库清空成功。")
        $B += 1
        Else 
        _FileWriteLog(@ScriptDir & "\交DBF.log",$FileName&"库初始化失败。")
        EndIf
        $i += 1
                                
        EndIf 
WEnd

;由于最后一重循环将$i增加1,但是没有读取DBF库,故将该值减一,表示实际读取了i个DBF库
$i-=1

;程序执行完毕,写注册表,并记录日志
;$B等于$i表示程序创建盘符个数与配置文件配置的个数一致,即程序执行成功
If( $B=$i ) Then
    RegWrite($REG,$KEYNAME,"REG_SZ","0") ; 若成功,创建键值为0
   _FileWriteLog(@ScriptDir & "\DBF.log","==========程序成功执行完毕==========")
Else
    RegWrite($REG,$KEYNAME,"REG_SZ","1") ; 若sb,创建键值为1
   _FileWriteLog(@ScriptDir & "\DBF.log","==========程序执行完毕,但出现错误,请检查==========")
EndIf
我程序要实现的功能是,根据配置文件DBF库的路径读取DBF库,并取得dbf库的count值,需要的判断:
1、查看配置文件里的配置,如果配置文件为空,B=0,退出循环,写日志
2、查看配置文件里的配置,若配置文件不为空,但缺少项目或某项值为空,则B=0,i+1,继续读取i=2的情况
3、如果一个或者多个配置项的值为空,则记录执行失败日志,B不增加,但$i加1,表示允许程序继续执行
进入下一级判断,如果配置项正常,则用自定义函数$C=readdbf($oexcel,$FilePath,$FileName,$ColumnNum)计算DBF的count值,若$C=0,即DBF库为空,则B+1(表示执行成功),退出循环;i+1进入下一个循环
4、如果配置项正常,但$C不等于0,退出循环,i=1进入下一个循环

程序运行完毕后,写注册表键值
$B等于$i表示程序创建盘符个数与配置文件配置的个数一致,即程序执行成功,注册表置0,否则值1

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-12-13 16:59:10 | 显示全部楼层
为什么啊,这是为什么啊。。。
发表于 2010-12-13 17:08:45 | 显示全部楼层
整理好了再发,看不明白
发表于 2010-12-13 17:15:34 | 显示全部楼层
不明白你的程序意图,至少你得告诉我们,你的程序要在什么样的情况下面退出哦,目前只有看到你的程序有这样一个出口!不死才怪....
If ($FileName= "NotFound" And $FilePath= "NotFound" and  ($B=0 And $i=1 ) then exitloop
发表于 2010-12-13 18:00:26 | 显示全部楼层
本帖最后由 _ddqs. 于 2010-12-13 18:29 编辑

把下面2行代码加到循环中的适合位置~~~
        If $FIleName = "" Then $FIleName = "NotFound" 
        If $FilePath = "" Then $FilePath = "NotFound"
While (1)
       
        If $FIleName = "" Then $FIleName = "NotFound"
        If $FilePath = "" Then $FilePath = "NotFound"


-----------------------------------------------------------------------------------
_FileWriteLog(@ScriptDir & "\交DBF.log", $FIleName & "库初始化失败。")
                        
                        ExitLoop ;这里可能是非法文件名,读取失败 也退出!
                EndIf
发表于 2010-12-13 18:46:51 | 显示全部楼层
本帖最后由 _ddqs. 于 2010-12-13 19:25 编辑

逻辑有点乱,处理有点类似下面的代码,自己再修改下
;写记录不要在循环内检测:

        If ($FIleName = "NotFound" And $FilePath = "NotFound") Then
                ;If ($B = 0 And $i = 1) Then
                        _FileWriteLog(@ScriptDir & "\DBF.log", "配置文件无任何配置,无法验证DBF库否清空")
                ;EndIf
                ;ExitLoop
        EndIf

        ;如果缺少一个或者多个配置项,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
        If ($FIleName = "NotFound" Or $FilePath = "NotFound") Then
                _FileWriteLog(@ScriptDir & "\DBF.log", "缺少部分配置项," & $FilePath & $i & "库清空失败。")
                ;$i += 1
                ;ContinueLoop
        EndIf

        ;如果一个或者多个配置项的值为空,则记录执行失败日志,$B不增加,但$i加1,表示允许程序继续执行
        If ($FIleName = "" Or $FilePath = "") Then
                _FileWriteLog(@ScriptDir & "\DBF.log", "配置项的值不能为空,Disk" & $FilePath & $i & "库清空失败。")
                ;$i += 1
        EndIf


While (1)
        
                If Not FileExists( $FilePath & $FIleName) Then ExitLoop ;不存在文件
                        
                $C = readdbf($oexcel, $FilePath, $FIleName, $ColumnNum)
                If $C = 0 Then
                        _FileWriteLog(@ScriptDir & "\DBF.log", $FIleName & "库清空成功。")
                        $B += 1
                Else
                        _FileWriteLog(@ScriptDir & "\交DBF.log", $FIleName & "库初始化失败。")
                EndIf

                If ($B = 0 And $i = 1) Then
                        _FileWriteLog(@ScriptDir & "\DBF.log", "配置文件无任何配置,无法验证DBF库否清空")
                        ;ExitLoop
                EndIf
                
                ;如果配置文件为空,即$B=0,则记录日志后退出循环,结束程序
                If $B=0 Then  ExitLoop ;
                
                If $i>99 Then  ExitLoop ; 当$B非0时的出口,限定循环最高次

                
                $i += 1

        If (任务=异常) then Sleep(1000)  ;调试用
WEnd

评分

参与人数 1金钱 +25 收起 理由
afan + 25

查看全部评分

发表于 2010-12-13 19:02:27 | 显示全部楼层
顶,顺便学习。
 楼主| 发表于 2010-12-16 15:09:40 | 显示全部楼层
哦。。这样。。。。。学习了,看来要继续修炼才行。
发表于 2014-5-17 20:41:15 | 显示全部楼层
雷锋精神传天下!谢谢分享!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 22:50 , Processed in 0.092011 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表