[已解决]如何检查出脚本中存在的所有变量并声明?
本帖最后由 ac5474012 于 2010-8-15 20:23 编辑最近我1000行的繁琐au3报错变量未声明,所以我想问问有没有把所有变量在程序开始声明一下的方法.这样即使可能会出错误.但是不会报错停止.
请各位指教
下面有几个高人出的办法,不过我没试过。这是我自己的办法,总算解决了~~~
我现在用这个办法解决由变量未声明的问题.
使用方法:在脚本中加入Opt("MustDeclareVars", 1).在将弹出的 ...
ac5474012 发表于 2010-8-5 15:23 http://www.autoitx.com/images/common/back.gif
dim $au3
dim $c
dim $d
$au3 = FileOpenDialog("请选择你要打开的脚本文件", "", "AU3脚本文件(*.au3)", 1)
If @error Then
MsgBox(4096,"","没有选中任何文件。",3)
exit
EndIf
$file = FileOpen($au3, 0)
If $file = -1 Then
MsgBox(0, "错误", "无法打开目标文件。",3)
Exit
EndIf
; 每次读取1行字符直到文件结尾(EOF,End-Of-File) 为止
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
$a = StringInStr($line, "$")
if $a <> 0 then
$line = StringTrimLeft($line, $a)
$b = 1
do
$d = $c
$c = StringLeft($line, $b)
$b = $b + 1
Until $d = $c or StringIsAlNum($c) = 0
$c = StringLeft($line, $b - 2)
if $c <> "" then cf()
endif
Wend
FileClose($file)
$file2 = FileOpen($au3&".au3", 2)
$var = IniReadSection($au3&".ini","所有变量")
If @error Then
MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.",3)
exit
Else
For $i = 1 To $var
FileWriteLine($file2, "Dim $"&$var[$i])
Next
EndIf
$file3 = FileOpen($au3, 0)
If $file3 = -1 Then
MsgBox(0, "错误", "无法打开目标文件。",3)
Exit
EndIf
While 1
$line = FileReadLine($file3)
If @error = -1 Then ExitLoop
FileWriteLine($file2, $line)
Wend
FileClose($file3)
FileClose($file2)
FileDelete($au3&".ini")
func cf()
$file3 = FileOpen($au3, 0)
If $file = -1 Then
else
$e = 0
While 1
$line3 = FileReadLine($file3)
If @error = -1 Then ExitLoop
if StringInStr($line3,"Dim $"&$c) <> 0 then $e = 1
Wend
if $e = 0 then IniWrite($au3&".ini", "所有变量", $c, "")
EndIf
FileClose($file3)
endfunc
回复 2# xsjtxy
强大,不过这你试过吗?你知道我的程序已经很混乱了.
这样,我说一下你这些脚本的用途你看看我说的对不对好吗?
#
打开AU3文件把所有变量找出来,然后写入一个ini,然后再从ini中读取变量写入au3尾行.
#
但是你怎么判断哪些是没有声明的变量?算了 我在详细看看吧. func cf()
这个函数就是判断有没有申明过的 我觉得思路应该就是这样。根据你需要再改进些应该可以用的。 本帖最后由 3mile 于 2010-8-2 16:07 编辑
借用楼上兄弟的代码作为分析的数据。
前79行均为楼上兄弟的代码,作为一个字符串:#include <array.au3>
$Str = _
'dim $au3' & @CRLF & _
'dim $c' & @CRLF & _
'dim $d' & @CRLF & _
'$au3 = FileOpenDialog("请选择你要打开的脚本文件", "", "AU3脚本文件(*.au3)", 1)' & @CRLF & _
'' & @CRLF & _
'If @error Then' & @CRLF & _
' MsgBox(4096,"","没有选中任何文件。",3)' & @CRLF & _
'exit' & @CRLF & _
'EndIf' & @CRLF & _
'' & @CRLF & _
'$file = FileOpen($au3, 0)' & @CRLF & _
'If $file = -1 Then' & @CRLF & _
' MsgBox(0, "错误", "无法打开目标文件。",3)' & @CRLF & _
' Exit' & @CRLF & _
'EndIf' & @CRLF & _
'' & @CRLF & _
'; 每次读取1行字符直到文件结尾(EOF,End-Of-File) 为止' & @CRLF & _
'While 1' & @CRLF & _
' $line = FileReadLine($file)' & @CRLF & _
' If @error = -1 Then ExitLoop' & @CRLF & _
'$a = StringInStr($line, "$")' & @CRLF & _
'if $a <> 0 then' & @CRLF & _
'$line = StringTrimLeft($line, $a)' & @CRLF & _
'$b = 1' & @CRLF & _
'' & @CRLF & _
'do' & @CRLF & _
'$d = $c' & @CRLF & _
'$c = StringLeft($line, $b)' & @CRLF & _
'$b = $b + 1' & @CRLF & _
'Until $d = $c or StringIsAlNum($c) = 0' & @CRLF & _
'$c = StringLeft($line, $b - 2)' & @CRLF & _
'if $c <> "" then cf()' & @CRLF & _
'endif' & @CRLF & _
'Wend' & @CRLF & _
'FileClose($file)' & @CRLF & _
'' & @CRLF & _
'$file2 = FileOpen($au3&".au3", 2)' & @CRLF & _
'$var = IniReadSection($au3&".ini","所有变量")' & @CRLF & _
'If @error Then ' & @CRLF & _
' MsgBox(4096, "", "发生错误,可能目标文件并非标准的INI文件.",3)' & @CRLF & _
'exit' & @CRLF & _
'Else' & @CRLF & _
' For $i = 1 To $var' & @CRLF & _
' FileWriteLine($file2, "Dim $"&$var[$i])' & @CRLF & _
' Next' & @CRLF & _
'EndIf' & @CRLF & _
'' & @CRLF & _
'$file3 = FileOpen($au3, 0)' & @CRLF & _
'If $file3 = -1 Then' & @CRLF & _
' MsgBox(0, "错误", "无法打开目标文件。",3)' & @CRLF & _
' Exit' & @CRLF & _
'EndIf' & @CRLF & _
'While 1' & @CRLF & _
' $line = FileReadLine($file3)' & @CRLF & _
' If @error = -1 Then ExitLoop' & @CRLF & _
' FileWriteLine($file2, $line)' & @CRLF & _
'Wend' & @CRLF & _
'FileClose($file3)' & @CRLF & _
'FileClose($file2)' & @CRLF & _
'FileDelete($au3&".ini")' & @CRLF & _
'' & @CRLF & _
'func cf()' & @CRLF & _
'$file3 = FileOpen($au3, 0)' & @CRLF & _
'If $file = -1 Then' & @CRLF & _
'else' & @CRLF & _
'$e = 0' & @CRLF & _
'While 1' & @CRLF & _
' $line3 = FileReadLine($file3)' & @CRLF & _
' If @error = -1 Then ExitLoop' & @CRLF & _
'if StringInStr($line3,"Dim $"&$c) <> 0 then $e = 1' & @CRLF & _
'Wend' & @CRLF & _
'if $e = 0 then IniWrite($au3&".ini", "所有变量", $c, "")' & @CRLF & _
'EndIf' & @CRLF & _
'FileClose($file3)' & @CRLF & _
'endfunc' & @CRLF & _
''
Local $var
$var_temp=StringRegExp($str,'\$\w*',3)
If Not @error Then $var_array=_ArrayUnique($var_temp)
For $i=1 To $var_array
$var&=$var_array[$i]&","
Next
MsgBox(0,'包含变量有:',"local "&StringLeft($var,StringLen($var)-1)) 本帖最后由 ac5474012 于 2010-8-3 09:50 编辑
回复 6# 3mile
那个你这个又是什么呢?能简单的说说吗?
还有中间每行前面都有一个 ' 这是什么?能给去掉吗? 回复3mile
那个你这个又是什么呢?能简单的说说吗?
ac5474012 发表于 2010-8-3 08:52 http://www.autoitx.com/images/common/back.gif
读取你的代码,正则枚举所有变量。 回复 8# 3mile
中间每行前面都有一个 ' 这是什么?能给去掉吗? 回复 2# xsjtxy
xsjtxy 发表于 2010-8-2 10:47 http://www.autoitx.com/images/common/back.gif
用了一下,没发现有什么变化啊?能不能说说,是不是如果没发现目标*.au3文件尾有什么变化就是没发现有未声明的变量是吗? 1000行的代码难道一次未经调试就写出来了?不然不会有此烦恼… 回复 9# ac5474012
这个要问AFAN大人。字符串转变量用的AFAN大人的函数。
哈哈 lz, 你觉得1000行大吗,太小了 又可以偷懒啦好东西啊 回复 13# netegg
1000行对于我很多
页:
[1]
2