ac5474012 发表于 2010-8-2 09:40:47

[已解决]如何检查出脚本中存在的所有变量并声明?

本帖最后由 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

xsjtxy 发表于 2010-8-2 10:47:16


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

ac5474012 发表于 2010-8-2 13:11:50

回复 2# xsjtxy

强大,不过这你试过吗?你知道我的程序已经很混乱了.

这样,我说一下你这些脚本的用途你看看我说的对不对好吗?
#
打开AU3文件把所有变量找出来,然后写入一个ini,然后再从ini中读取变量写入au3尾行.
#
但是你怎么判断哪些是没有声明的变量?算了 我在详细看看吧.

xsjtxy 发表于 2010-8-2 14:48:59

func cf()
这个函数就是判断有没有申明过的

xsjtxy 发表于 2010-8-2 14:49:31

我觉得思路应该就是这样。根据你需要再改进些应该可以用的。

3mile 发表于 2010-8-2 16:06:43

本帖最后由 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 08:52:47

本帖最后由 ac5474012 于 2010-8-3 09:50 编辑

回复 6# 3mile

那个你这个又是什么呢?能简单的说说吗?
还有中间每行前面都有一个 ' 这是什么?能给去掉吗?

3mile 发表于 2010-8-3 09:31:25

回复3mile

那个你这个又是什么呢?能简单的说说吗?
ac5474012 发表于 2010-8-3 08:52 http://www.autoitx.com/images/common/back.gif
读取你的代码,正则枚举所有变量。

ac5474012 发表于 2010-8-3 09:59:04

回复 8# 3mile
中间每行前面都有一个 ' 这是什么?能给去掉吗?

ac5474012 发表于 2010-8-3 10:20:18

回复 2# xsjtxy


xsjtxy 发表于 2010-8-2 10:47 http://www.autoitx.com/images/common/back.gif

用了一下,没发现有什么变化啊?能不能说说,是不是如果没发现目标*.au3文件尾有什么变化就是没发现有未声明的变量是吗?

afan 发表于 2010-8-3 10:24:29

1000行的代码难道一次未经调试就写出来了?不然不会有此烦恼…

3mile 发表于 2010-8-3 10:33:04

回复 9# ac5474012
这个要问AFAN大人。字符串转变量用的AFAN大人的函数。
哈哈

netegg 发表于 2010-8-3 10:55:54

lz, 你觉得1000行大吗,太小了

menfan1 发表于 2010-8-3 13:55:57

又可以偷懒啦好东西啊

ac5474012 发表于 2010-8-3 16:15:52

回复 13# netegg

1000行对于我很多
页: [1] 2
查看完整版本: [已解决]如何检查出脚本中存在的所有变量并声明?