本帖最后由 lm099 于 2009-9-20 01:43 编辑
我的目的是从上百个文本的前300行里面提取出有关键字的行,输出到另外一个文本里面并用等号分隔,目前代码如下:;批量处理文件,导出其中的配置信息
#Include <File.au3>
;选择一个或多个文本文件
Dim $strFiles = FileOpenDialog("选择一个或多个文本文件", "D:\everest\Reports" & "" , "文本文档(*.ini)", 1+4)
If @error Or $strFiles = "" Then
MsgBox(4096, "警告", "选择文件失败!")
Exit
EndIf
;将多个文件路径分割
Dim $arrFileList = StringSplit($strFiles, "|")
;产生标准路径的文件名数组
Dim $arrFileList2 = $arrFileList
If $arrFileList[0]<>1 Then
For $x = 1 to $arrFileList[0]-1
$arrFileList2[$x] = $arrFileList[1] & "" & $arrFileList[$x+1]
Next
$arrFileList2[0] = $arrFileList2[0] - 1
EndIf
Dim $iFileIndex = 1
$file = FileOpen("D:\out.txt", 1)
For $iFileIndex = 1 To $arrFileList2[0]
Dim $aRecords[301]
If Not _FileReadToArray($arrFileList2[$iFileIndex],$aRecords) Then
MsgBox(4096, "警告", "文件读入数组失败!")
Exit
EndIf
Sleep(200)
Sleep(200)
For $x = 1 to 300
If StringRegExp($aRecords[$x], '.*计算机名称.*|.*显示器.*|.*总计容量.*|.*主 IP 地址.*|.*主 MAC 地址.*|.*DMI 系统制造商.*|.*DMI 系统产品.*|.*DMI 系统序列号.*|.*原始时钟频率.*|.*物理内存\|总计.*', 0) then
FileWrite ($file, $aRecords[$x] & '=')
Sleep(500)
Endif
Next
FileWrite ($file, $arrFileList2[$iFileIndex])
Sleep(500)
FileWrite ($file, @CRLF)
Sleep(500)
Next
FileClose ($file)
Sleep(1000)
RunWait(@ComSpec & " /c " & 'start D:\out.txt', "", @SW_HIDE)
本来是没有那么多Sleep的,后来发现多加几个延时出错率就低一点。
此脚本读取一个ini文本就没事,读取多个的时候就要看运气了,有时候两个都会出错,有时候十几个也能过,但是二十个就肯定不行了,出现错误如下:
需要处理的ini文本如下:
如果要帮忙的可以复制个几十份来测试,越多就越容易出现。
目前做过的测试如下:
1、将匹配的正则表达式改成只需要匹配一个字符串,问题依旧。
2、将匹配的判断去掉,即纯粹输出每一行,则可以通过。
3、只匹配,不输出,问题依旧。
……
其余的测试也做了不少,不过意义不大,反正问题应该是出在匹配那里,可是就是不知道哪有错误。还望指教! |