surongfu 发表于 2012-6-25 17:42:38

求助!不知道哪里错了会重复写入ini (已解决)

本帖最后由 surongfu 于 2012-6-25 22:41 编辑

这是我到处收集来的代码用来检测硬件信息并收集起来,挺准确的现在不知道是哪错了一直会重复写入
代码如下:#Include <File.au3>
RunWait(@ComSpec & ' /c ' &' dxdiag /whql:off /t c:\windows\getinfo.txt', '', 0);运行dxdiag并生成报告
$txt = FileRead("c:\windows\getinfo.txt");读取生成的报告
$xx = StringRegExp($txt,'Card name:\s(.*)',3);查找ard name: 后面的值
$audio = StringRegExp($txt,'Description:\s(.*)',3);查找Description: 后面的值
$cpuname = StringRegExp($txt,'Processor:\s(.*)',3);查找Processor: 后面的值
$computername = StringRegExp($txt,'Machine name:\s(.*)',3);查找Machine name: 后面的值
;以下是利用wmi检测内存的容量和条数的代码
Global $objwmiservice,$wnc,$mem1, $mem3
                Local $object, $objoperatingsystem
               
$objwmiservice = ObjGet("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
$wnc = $objwmiservice.execquery("select * from win32_physicalmemory")

For $object In $wnc
                        $mem = String(Int($object.capacity / 1048576))
                        If $mem1 = "" Then
                              $mem1 = $mem & "MB"
                              $mem2 = ""
                        Else
                              $mem1 &= "/" & $mem & "MB"
                              $mem2 = "(" & $mem1 & ")"
                        EndIf
                        $mem3 += $mem
                Next
                $nc = $mem3 & "MB" & $mem2
                                ;利用wmi检测内存容量和条数结束
               
Local $sFile = IniRead(@ScriptDir & "\config.ini", "config", 1, 1);读取根目录下config.ini的配置
IniWrite($sFile, '硬件信息', $computername , '主板:' & _MbGet() & ',处理器:' & $cpuname & ' , 内存:' & $nc & ',显卡:' & $xx & ',声卡:' & $audio & @CRLF)
;;;以下为读取
Local $sInfo = IniRead($sFile, '硬件信息', @ComputerName, '读取错误')


Func _MbGet();利用wmi读取主板的信息
      Local $objWMIService = ObjGet('winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2')
      Local $colBoard = $objWMIService.ExecQuery('SELECT * FROM Win32_BaseBoard')
      For $object In $colBoard
                Local $mb = $object.Product
      Next
      Return $mb

EndFunc   ;==>_MbGetini名为config.ini内容如下:

1=e:\硬件.ini

采集效果如下:


现在请大侠们帮我修改一下让其重复运行au3让其不会重复写入,发现新的变动则覆盖原来的信息谢谢了
收集到的硬件.ini我也上传上来,附件如下:

Alam 发表于 2012-6-25 18:16:48

像我这样就会覆盖.
IniWrite($sFile, '硬件信息', @ComputerName,'主板:' & _MbGet() & ',处理器:' & $cpuname & ' , 内存:' & $nc & ',显卡:' & $xx & ',声卡:' & $audio)

sanmoking 发表于 2012-6-25 18:24:58

本帖最后由 sanmoking 于 2012-6-25 18:41 编辑

目测似乎是那个黑块块字符造成的。。。应该$computername读取到的里面有特殊字符,存进【硬件.ini】之后,看上去每次保存的计算机名是一样的,但是IniWrite的时候实际是把【计算机名】当作不同的值又重新写了一个,而不是更新原来那个。
我估计那个黑块块是记事本不支持显示的特殊的换行符之类的东西,比如“垂直制表符”(ascII码=11),记事本打开看到是一行,程序写入和读取ini的时候,实际会当作不同的行写的。。那样的话,自然会重新再写一遍,但是写入的还是不正确的ini数据。。。。

不信你试试:IniWrite("硬件.ini" , "硬件信息" , "计算机名"&Chr("11") , "主板"&Chr("11")&"xianka"&Chr("11")&"yingpan")



就算楼上的解决了“关键字”没有特殊字符的问题,后边“值”里面有问题也是会出错的,例如:
IniWrite("硬件.ini" , "硬件信息" , "计算机名" , "主板"&Chr("13")&"xianka"&Chr("13")&"yingpan")

surongfu 发表于 2012-6-25 18:49:16

像我这样就会覆盖.
IniWrite($sFile, '硬件信息', @ComputerName,'主板:' & _MbGet() & ',处理器:' & $cpu ...
Alam 发表于 2012-6-25 18:16 http://www.autoitx.com/images/common/back.gif


    虽然前面部份不会重复写入但是后面的还是会重复写入

surongfu 发表于 2012-6-25 18:50:18

目测似乎是那个黑块块字符造成的。。。应该$computername读取到的里面有特殊字符,存进【硬件.ini】之后 ...
sanmoking 发表于 2012-6-25 18:24 http://www.autoitx.com/images/common/back.gif


    难道就没有办法完善解决了吗?555555555好不容易收集到适合自己用的代码眼看就要失败而告终了

sanmoking 发表于 2012-6-25 19:01:21

回复 5# surongfu


    把你的【硬件.ini】上传上来看一下,是什么字符搞的。。把他去掉就好了。。

surongfu 发表于 2012-6-25 19:06:24

本帖最后由 surongfu 于 2012-6-25 19:12 编辑

sanmoking 元老兄我已经上传硬件.rar

afan 发表于 2012-6-25 19:12:59

Card name:\s(.*)
Description:\s(.*)
Processor:\s(.*)
Machine name:\s(.*)

这样的正则表达式都会捕捉到行末的回车符,即黑方块。造成Ini读写错误。将“(.*)”改为“(\V*)”

sanmoking 发表于 2012-6-25 19:13:36

回复 7# surongfu


    不用了, 我直接运行了一下你一楼的代码就得到ini了。。。
发现的确是@cr搞的鬼。。。。

把第三行换成下面这句,把@cr去掉了就行了。。
$txt = StringReplace(FileRead("c:\windows\getinfo.txt"),@CR,"");读取生成的报告


另外发现还有一个错误,第29行换成下面这句
Local $sFile = IniRead(@ScriptDir & "\config.ini", "config", 1 , "硬件.ini");读取根目录下config.ini的配置

sanmoking 发表于 2012-6-25 19:16:15

不过我觉得你ini的设置不是很合理。。
其实应该这样比较合理:

【硬件.ini】
[计算机名1]
主板=xxxx
显卡=xxxx
cpu=xxxx
[计算机名2]
主板=xxxx
显卡=xxxx
cpu=xxxx

surongfu 发表于 2012-6-25 19:20:38

回复 10# sanmoking


    是不合理,但我比较笨只能通过我那样的格式才方便自己统计硬件信息嘿嘿

sanmoking 发表于 2012-6-25 19:23:51

回复 8# afan


    正则对于我来说犹如天书。。。
我都自己想办法解决。。。


Func ies($datt, $a, $b, $reee = "", $s = 1, $c = 1);查找$a$b之间的文字,$a = 前面的关键词,$b=后边的关键词, $reee =查询失败返回的默认值,$s = 从哪里开始查询 ,默认从$data最开始,$c = 查询第几个,默认为1
        $start = StringInStr($datt, $a, 0, $c, $s)
        If $start > 0 Then
                $start = $start + StringLen($a);查找$a的结束位置
        Else
                Return $reee
        EndIf
        $end = StringInStr($datt, $b, 0, 1, $start);从$a的结束位置开始查找$b的位置
        If $end > 0 Then
                $amount = $end - $start;获得中间部分字符的数量
        Else
                Return $reee
        EndIf
        Return StringMid($datt, $start, $amount);返回结果
EndFunc   ;==>ies


见笑了,我写变量名都随便弄弄,上面是我自己用的最多的func,取两边的特征字符中间的部分,对于不会正则的来说非常好用
,正则用不好,失之一点,差之千里。。。

Alam 发表于 2012-6-25 19:23:59

回复 8# afan


    原来是这样啊, 哈哈, 他们俩还在那里嘀咕呢!

sanmoking 发表于 2012-6-25 19:26:57

回复 13# Alam


    高手,见笑了。。。

FanError 发表于 2012-6-25 21:21:18

高手~高手~高手~
页: [1] 2
查看完整版本: 求助!不知道哪里错了会重复写入ini (已解决)