一次提取十几个文本的内容就会出错怎么办?(换新版本搞定)
本帖最后由 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<>1 Then
For $x = 1 to $arrFileList-1
$arrFileList2[$x] = $arrFileList & "\" & $arrFileList[$x+1]
Next
$arrFileList2 = $arrFileList2 - 1
EndIf
Dim $iFileIndex = 1
$file = FileOpen("D:\out.txt", 1)
For $iFileIndex = 1 To $arrFileList2
Dim $aRecords
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、只匹配,不输出,问题依旧。
……
其余的测试也做了不少,不过意义不大,反正问题应该是出在匹配那里,可是就是不知道哪有错误。还望指教! 测试了,去掉了所有的sleep,我复制了60多个ini文件,也没见错误,1、2秒就完成了。 又复制了256个ini测试,也没问题,5秒完成... 好像我也遇到过同样的问题现在还没解决 又复制了....
算了,估计你某个ini有问题,而这两个ini没问题 我也就是拿这两个ini复制出来测试的,其它的ini还没产生呢。。。
真是奇怪,现在我有时候读取一个文件也会出错了,都不知道怎么回事。我把本机360、防火墙之类能关的都关了也是这样。 我的版本3.3.1.1 我的是3.2.11.1.1,难道是这个原因?我去试试。 奇怪的事情发生了:更换成最新版本后,开始几次还是不行,也没有错误提示直接退出了。后来可以运行通过了,但是发现其中有很多字符串匹配不到,例如我这么一段:If StringRegExp($aRecords[$x], '.*计算机名称.*|.*显示器.*|.*总计容量.*|.*主 IP 地址.*|.*主 MAC 地址.*|.*DMI 系统制造商.*|.*DMI 系统产品.*|.*DMI 系统序列号.*|.*CPU 类型.*|.*系统内存.*', 0)then
FileWrite ($file, $aRecords[$x] & '=')
Endif最后只产生了计算机名称、CPU 类型、系统内存这3个匹配到的字符串,实际上ini文本中可以找到上面所有的匹配内容,一个字都不错的,可是就是匹配不到。 把第一句改成:
If StringRegExp($aRecords[$x], '.*显示器.*', 0)then
后,明明所有文本中都有显示器那一行,偏偏就是一个都不产生。真是奇哉怪也。 本人去掉所有sleep,3.2.13.12.1及3310_1,3311_1,这3个版本,100个一下就完成。。。没出现什么错误,大概楼主的电脑有点不乐意干活,去别人的电脑试试 out.txt的部分内容计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\132-97-194-112.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (41) of 132-97-194-115.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy of 132-97-194-115.ini
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\132-97-194-112.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\132-97-194-115.ini
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (2) of 132-97-194-112.ini
计算机|计算机名称=TX2=显示设备|显示器1=Dell E151FPb (6W41438I2V3U)=分区|总计容量=74.5 GB (47.0 GB 可用)=网络|主 IP 地址=132.97.194.115=网络|主 MAC 地址=00-E0-4C-58-BC-80=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (2) of 132-97-194-115.ini
计算机|计算机名称=TX=显示设备|显示器1=即插即用监视器 (0000000000000)=分区|总计容量=74.5 GB (18.6 GB 可用)=网络|主 IP 地址=132.97.194.112=网络|主 MAC 地址=00-E0-4C-58-4A-11=DMI|DMI 系统制造商=<N/A>=DMI|DMI 系统产品=<N/A>=DMI|DMI 系统序列号=<N/A>=中央处理器 (CPU)|原始时钟频率=1500 MHz=R:\\Copy (3) of 132-97-194-112.ini 我换台1998年的老电脑(够老的,没使得扔),一运行ini没一会就出现楼主的错误,可能是系统及配置问题吧,这台98年的电脑是Win XP SP1_CN 256MB内存 CPU 517MHZ
现在的是双核1.6G 2G内存 WinXP SP3_EN 我修改你的源码。。。看看;批量处理文件,导出其中的配置信息
#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<>1 Then
For $x = 1 to $arrFileList-1
$arrFileList2[$x] = $arrFileList & "\" & $arrFileList[$x+1]
Next
$arrFileList2 = $arrFileList2 - 1
EndIf
Dim $iFileIndex = 1
$file = FileOpen("D:\out.txt", 1)
For $iFileIndex = 1 To $arrFileList2
Dim $aRecords
If Not _FileReadToArray($arrFileList2[$iFileIndex],$aRecords) Then
MsgBox(4096, "警告", "文件读入数组失败!")
Exit
EndIf
For $x = 1 to 300
If StringRegExp($aRecords[$x], '.*计算机名称.*|.*显示器.*|.*总计容量.*|.*主 IP 地址.*|.*主 MAC 地址.*|.*DMI 系统制造商.*|.*DMI 系统产品.*|.*DMI 系统序列号.*|.*原始时钟频率.*|.*物理内存\|总计.*', 0)then
FileWrite ($file, $aRecords[$x] & '=')
Endif
Next
FileWrite ($file, $arrFileList2[$iFileIndex])
FileWrite ($file, @CRLF)
Next
FileClose ($file)
RunWait(@ComSpec & " /c " & 'start D:\out.txt', "", @SW_HIDE) 我这仍然很正确,全部为完整匹配~
难不成真和电脑性能有关?这也许就可以解释sleep后的出错概率了
页:
[1]
2