liongodmien
发表于 2009-3-2 13:51:32
$a = '' & @CRLF & 'a.ipshougou.com=机器狗病毒存放主机2008/12/1' & @CRLF & _
'b.ipshougou.com=机器狗病毒存放主机2008/12/1' & @CRLF & 'www.biaoqing365.cn=机器狗病毒存放主机2008/12/1' & _
@CRLF & 'qq.icafe88.cn=机器狗病毒存放主机2008/12/1' & @CRLF & 'www.qq808a.cn=钓鱼网2008/12/1' & @CRLF
MsgBox(0,0,$a)
$a = StringRegExp($a, '\w+\.\w+\.\w+', 3, 1)
$b = ''
For $i = 0 To UBound($a) - 1
$b &= $a[$i] & @CRLF
Next
MsgBox(0,0, $b)
sfwd001
发表于 2009-3-3 09:55:37
感谢各位网友热心的帮助支持!
原思路是这样的,有一个配置文件 ProcessSafe.ini 里内有很多参数设置,其中就有一个自动从网上更新的恶性非法网站(已经收录有3千多个网站),客户机需要从这个配置文件 ProcessSafe.ini 中读出需要屏蔽的网站到本机hosts文件中。
我按照 KiwiCsj网友的程序修改成功了,但是这个程序只能读取1015行内容,还有2千多个行的内容没有读出!
ProcessSafe.ini 配置文件中需要屏蔽网站的内容格式
a.ipshougou.com=机器狗病毒存放主机2008/12/1
b.ipshougou.com=机器狗病毒存放主机2008/12/1
www.biaoqing365.cn=机器狗病毒存放主机2008/12/1
qq.icafe88.cn=机器狗病毒存放主机2008/12/1
www.qq808a.cn=钓鱼网2008/12/1
.................
我按照 KiwiCsj网友提供修改的程序
Local $var,$tmp_str,$file,$dt
$dt="ProcessSafe.ini"
$file="hosts"
$var = IniReadSection($dt, "Local_HostsDeny")
If @error <> 1 Then
For $i=1 to $var
$tmp_str&=@CRLF&"127.0.0.1 "&$var[$i]
Next
FileWrite($file,$tmp_str)
Else
MsgBox(4096, "结果", "没有找到")
EndIf
;FileWrite($file,@CRLF)
;FileClose($file)
MsgBox(0, "提示", "文件提取成功!")
现请各位网友再次帮助修改这个程序,让他可以读出3千多条记录,谢谢!
[ 本帖最后由 sfwd001 于 2009-3-3 09:58 编辑 ]
firewzy
发表于 2009-3-3 15:52:31
将所有的数据放在一个文本里,再定义一些特征数字,比如1代表机器狗病毒存放主机,2代表是钓鱼网,以此类推。然后一行表示一条记录,记录子项间使用“,”分割,如:
a.ipshougou.com,1,2008/12/1
b.ipshougou.com,1,2008/12/1
www.biaoqing365.cn,1,2008/12/1
qq.icafe88.cn,1,2008/12/1
www.qq808a.cn,2,2008/12/1
然后写个函数对此文本文件的内容进行解读并写入到一个2维数组中返回。如下:
#include <file.au3>
Func GetDataFromTxt($strFilePath)
Local $aRecords;
If Not _FileReadToArray($strFilePath, $aRecords) Then
MsgBox(4096, "Error", " Error reading log to Array error:" & @error)
Return
EndIf
If (Not IsArray($aRecords)) Or $aRecords = 0 Then
MsgBox(4096, "Error", $strFilePath & " is a empty file.")
Return
EndIf
;定义新数组存储分割后的数据
Local $aRecordSplt[$aRecords+1];
$aRecordSplt = $aRecords
Local $aRecTemp;
Local $iRecIndex = 1, $iStrIndex = 1;
For $iRecIndex = 1 To $aRecords
$aRecTemp = StringSplit($aRecords[$iRecIndex], ",") ;分割字符串
;将分割后的数组各项赋给多维数组
If $aRecTemp > 0 Then
For $iStrIndex = 1 To $aRecTemp
$aRecordSplt[$iRecIndex][$iStrIndex-1] = $aRecTemp[$iStrIndex]
Next
EndIf
Next
Return $aRecordSplt
EndFunc
sfwd001
发表于 2009-3-4 10:29:10
感谢firewzy 网友的回复和程序,有一点需要指出,ProcessSafe.ini 配置文件是不可修改的
cnsnc
发表于 2009-3-4 12:02:23
这个问题还没解决??
狮子的方法可以用啊,读文件用fileread或filereadline就可以了
sfwd001
发表于 2009-3-4 15:38:57
不好意思,这个问题目前还是没有解决!
firewzy
发表于 2009-3-4 18:30:38
#include <array.au3>
Dim $arrIniHosts = GetDataFromIni("c:\test.ini")
If IsArray($arrIniHosts) Then
_ArrayDisplay($arrIniHosts)
EndIf
Func GetDataFromIni($strIniPath)
;判断文件是否存在,若不存在则返回FALSE
If Not FileExists($strIniPath) Then Return False
;打开文件
Local $fIniFileRead = FileOpen($strIniPath, 0)
;找到所在的位置
Local $strLine = ""
While 1
$strLine = FileReadLine($fIniFileRead)
If @error Then Return False ;如果读行失败,则返回FALSE
If StringStripWS($strLine, 3) = "" Then ExitLoop
Wend
;读取下的各行,直到遇到下一个字段名
Local $arrHosts = [] ;定义存储INI中网址与网址类型的数组
Local $iEqualPos = 0 ;定义等于号所在的位置变量
Local $iArrayUbound = 0 ;定义数组维数
While 1
$strLine = FileReadLine($fIniFileRead)
If @error Then ExitLoop ;如果读行失败,则退出循环
$strLine = StringStripWS($strLine, 3) ;删除字符串开始与末尾的空格
If StringInStr($strLine, "[") > 0 And StringInStr($strLine, "]") > 0 Then ExitLoop ;如果发现[]中括号则表示找到下一个字段名,则退出循环
$iEqualPos = StringInStr($strLine, "=") ;查找等于号=的位置
If $iEqualPos = 0 Then ContinueLoop ;如果没有找到等于号=,则继续读取下一行
$iArrayUbound = UBound($arrHosts)
ReDim $arrHosts[$iArrayUbound+1] ;重新定义数组大小
$arrHosts[$iArrayUbound] = StringLeft($strLine, $iEqualPos-1) ;将等于号=前面的字符串赋给数组的第一维
$arrHosts[$iArrayUbound] = StringMid($strLine, $iEqualPos+1) ;将等于号=后面的字符串赋给数组的第二维
WEnd
$arrHosts = UBound($arrHosts) - 1
Return $arrHosts
EndFunc
----------------------"c:\test.ini"---------------------------
a.ipshougou.com=机器狗病毒存放主机2008/12/1
b.ipshougou.com=机器狗病毒存放主机2008/12/1
www.biaoqing365.cn=机器狗病毒存放主机2008/12/1
qq.icafe88.cn=机器狗病毒存放主机2008/12/1
www.qq808a.cn=钓鱼网2008/12/1
----------------------"c:\test.ini"---------------------------
[ 本帖最后由 firewzy 于 2009-3-4 18:32 编辑 ]
sfwd001
发表于 2009-3-5 12:54:13
原帖由 firewzy 于 2009-3-4 18:30 发表 http://www.autoitx.com/images/common/back.gif
#include
Dim $arrIniHosts = GetDataFromIni("c:\test.ini")
If IsArray($arrIniHosts) Then
_ArrayDisplay($arrIniHosts)
EndIf
Func GetDataFromIni($strIniPath)
;判断文件是否存在,若不存 ...
再次感谢firewzy 的回复程序,可是,不好意思,您的程序无法运行,如果把第五行的内容变成这样 _ArrayDisplay($arrIniHosts,"ok") 则可以运行下去,但没有结果,消息框内出现以下红色提示:
C:\PROGRA~1\AutoIt3\Include\array.au3 (176) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$sMsg = $sMsg & "[" & $iCounter & "] = " & StringStripCR($avArray[$iCounter]) & @CR
$sMsg = $sMsg & "[" & $iCounter & "] = " & StringStripCR(^ ERROR
------------------------------------------------------------
是不是我的这个编译程序的问题?我的版本:
SciTE
版本号: 1.72
Jan 15 2007 21:43:31
作者: Neil Hodgson.
December 1998-January 2007.
http://www.scintilla.org
Lua scripting language by TeCGraf, PUC-Rio
http://www.lua.org
2004年10月02日本地化。版本号:1.61
本地化: konan
感谢riverofchina对1.54版的汉化
---------------------------------------------------------------------
[ 本帖最后由 sfwd001 于 2009-3-5 13:07 编辑 ]
范统.贾
发表于 2009-3-5 17:11:35
学习一下。
xrbenbeba
发表于 2009-3-5 17:28:14
还真是自己不想
全靠大家啊
pcbar
发表于 2009-3-5 18:57:13
把ini文件发上来吧
netegg
发表于 2009-3-5 20:10:48
pcbar的建议不错,在自己这先试一下,别到时候又出错
sfwd001
发表于 2009-3-9 18:35:09
感谢各位网友热心的回复,ProcessSafe.ini配置文件已经上传,请网友改名为ini文件就可以了。
pcbar
发表于 2009-3-9 22:21:54
$file = @ScriptDir & "\ProcessSafe.ini"
$filew = @ScriptDir & "\out.txt"
$n = 0
$m=_FileCountLines($file)
$fh = FileOpen($file, 0)
$fhw = FileOpen($filew, 2)
ProgressOn("正在处理...","正在处理第行")
While 1
$n += 1
$line = FileReadLine($fh)
If @error = -1 Then ExitLoop
$b = StringRegExp($line, "(\w+\.)+\w+", 2)
If IsArray($b) Then FileWrite($fhw, $b&@CRLF);如查不需要Local_ProcessDeny段,在此处加上判断
ProgressSet(Ceiling($n/$m*100),"正在提取:"&$line,"正在处理第"&$n&"行")
WEnd
FileClose($fh)
FileClose($fhw)
ProgressOff()
ShellExecute($filew)
Exit
Func _FileCountLines($sFilePath)
Local $N = FileGetSize($sFilePath) - 1
Local $M= ""
If @error Or $N = -1 Then Return 0
$M=FileRead($sFilePath)
$M=StringReplace($M,@CRLF,@CR)
$M=StringSplit($M,@CR)
Return $M
EndFunc ;==>_FileCountLines
sfwd001
发表于 2009-3-11 19:00:20
ShellExecute($filew) 这一行出错!我也不知道为什么会出错,请帮助看看,谢谢大家