找回密码
 加入
搜索
查看: 8725|回复: 22

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

 火.. [复制链接]
发表于 2010-8-2 09:40:47 | 显示全部楼层 |阅读模式
本帖最后由 ac5474012 于 2010-8-15 20:23 编辑

最近我1000行的繁琐au3报错变量未声明,所以我想问问有没有把所有变量在程序开始声明一下的方法.这样即使可能会出错误.但是不会报错停止.

请各位指教

下面有几个高人出的办法,不过我没试过。这是我自己的办法,总算解决了~~~

我现在用这个办法解决由变量未声明的问题.

使用方法:在脚本中加入Opt("MustDeclareVars", 1).在将弹出的 ...
ac5474012 发表于 2010-8-5 15:23
发表于 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[0][0]
        FileWriteLine($file2, "Dim $"&$var[$i][0])
    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

评分

参与人数 1金钱 +10 贡献 +1 收起 理由
ac5474012 + 10 + 1 谢谢,很好的想法

查看全部评分

 楼主| 发表于 2010-8-2 13:11:50 | 显示全部楼层
回复 2# xsjtxy

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

这样,我说一下你这些脚本的用途你看看我说的对不对好吗?
#
打开AU3文件把所有变量找出来,然后写入一个ini,然后再从ini中读取变量写入au3尾行.
#
但是你怎么判断哪些是没有声明的变量?算了 我在详细看看吧.
发表于 2010-8-2 14:48:59 | 显示全部楼层
func cf()
这个函数就是判断有没有申明过的
发表于 2010-8-2 14:49:31 | 显示全部楼层
我觉得思路应该就是这样。根据你需要再改进些应该可以用的。
发表于 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[0][0]' & @CRLF & _
'        FileWriteLine($file2, "Dim $"&$var[$i][0])' & @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[0]
        $var&=$var_array[$i]&","
Next
MsgBox(0,'包含变量有:',"local "&StringLeft($var,StringLen($var)-1))

评分

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

查看全部评分

 楼主| 发表于 2010-8-3 08:52:47 | 显示全部楼层
本帖最后由 ac5474012 于 2010-8-3 09:50 编辑

回复 6# 3mile

那个你这个又是什么呢?能简单的说说吗?
还有中间每行前面都有一个 ' 这是什么?能给去掉吗?
发表于 2010-8-3 09:31:25 | 显示全部楼层
回复  3mile

那个你这个又是什么呢?能简单的说说吗?
ac5474012 发表于 2010-8-3 08:52

读取你的代码,正则枚举所有变量。
 楼主| 发表于 2010-8-3 09:59:04 | 显示全部楼层
回复 8# 3mile
中间每行前面都有一个 ' 这是什么?能给去掉吗?
 楼主| 发表于 2010-8-3 10:20:18 | 显示全部楼层
回复 2# xsjtxy

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


用了一下,没发现有什么变化啊?能不能说说,是不是如果没发现目标*.au3文件尾有什么变化就是没发现有未声明的变量是吗?
发表于 2010-8-3 10:24:29 | 显示全部楼层
1000行的代码难道一次未经调试就写出来了?不然不会有此烦恼…
发表于 2010-8-3 10:33:04 | 显示全部楼层
回复 9# ac5474012
这个要问AFAN大人。字符串转变量用的AFAN大人的函数。
哈哈
发表于 2010-8-3 10:55:54 | 显示全部楼层
lz, 你觉得1000行大吗,太小了
发表于 2010-8-3 13:55:57 | 显示全部楼层
又可以偷懒啦好东西啊
 楼主| 发表于 2010-8-3 16:15:52 | 显示全部楼层
回复 13# netegg

1000行对于我很多
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-13 06:04 , Processed in 0.097870 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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