找回密码
 加入
搜索
查看: 10584|回复: 19

[系统综合] 求助!不知道哪里错了会重复写入ini (已解决)

 火.. [复制链接]
发表于 2012-6-25 17:42:38 | 显示全部楼层 |阅读模式
本帖最后由 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[0] , '主板:' & _MbGet() & ',处理器:' & $cpuname[0] & ' , 内存:' & $nc & ',显卡:' & $xx[0] & ',声卡:' & $audio[0] & @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   ;==>_MbGet
ini名为config.ini内容如下:
[config]
1=e:\硬件.ini

采集效果如下:


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-6-25 18:16:48 | 显示全部楼层
像我这样就会覆盖.
IniWrite($sFile, '硬件信息', @ComputerName,'主板:' & _MbGet() & ',处理器:' & $cpuname[0] & ' , 内存:' & $nc & ',显卡:' & $xx[0] & ',声卡:' & $audio[0])
发表于 2012-6-25 18:24:58 | 显示全部楼层
本帖最后由 sanmoking 于 2012-6-25 18:41 编辑

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

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



就算楼上的解决了“关键字”没有特殊字符的问题,后边“值”里面有问题也是会出错的,例如:
IniWrite("硬件.ini" , "硬件信息" , "计算机名" , "主板"&Chr("13")&"xianka"&Chr("13")&"yingpan")
 楼主| 发表于 2012-6-25 18:49:16 | 显示全部楼层
像我这样就会覆盖.
IniWrite($sFile, '硬件信息', @ComputerName,'主板:' & _MbGet() & ',处理器:' & $cpu ...
Alam 发表于 2012-6-25 18:16



    虽然前面部份不会重复写入但是后面的还是会重复写入
 楼主| 发表于 2012-6-25 18:50:18 | 显示全部楼层
目测似乎是那个黑块块字符造成的。。。应该$computername[0]读取到的里面有特殊字符,存进【硬件.ini】之后 ...
sanmoking 发表于 2012-6-25 18:24



    难道就没有办法完善解决了吗?555555555好不容易收集到适合自己用的代码眼看就要失败而告终了
发表于 2012-6-25 19:01:21 | 显示全部楼层
回复 5# surongfu


    把你的【硬件.ini】上传上来看一下,是什么字符搞的。。把他去掉就好了。。
 楼主| 发表于 2012-6-25 19:06:24 | 显示全部楼层
本帖最后由 surongfu 于 2012-6-25 19:12 编辑

sanmoking 元老兄我已经上传硬件.rar
发表于 2012-6-25 19:12:59 | 显示全部楼层
Card name:\s(.*)
Description:\s(.*)
Processor:\s(.*)
Machine name:\s(.*)

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

评分

参与人数 1金钱 +10 收起 理由
Alam + 10

查看全部评分

发表于 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的配置
发表于 2012-6-25 19:16:15 | 显示全部楼层
不过我觉得你ini的设置不是很合理。。
其实应该这样比较合理:

【硬件.ini】
[计算机名1]
主板=xxxx
显卡=xxxx
cpu=xxxx
[计算机名2]
主板=xxxx
显卡=xxxx
cpu=xxxx
 楼主| 发表于 2012-6-25 19:20:38 | 显示全部楼层
回复 10# 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,取两边的特征字符中间的部分,对于不会正则的来说非常好用
,正则用不好,失之一点,差之千里。。。
发表于 2012-6-25 19:23:59 | 显示全部楼层
回复 8# afan


    原来是这样啊, 哈哈, 他们俩还在那里嘀咕呢!
发表于 2012-6-25 19:26:57 | 显示全部楼层
回复 13# Alam


    高手,见笑了。。。
发表于 2012-6-25 21:21:18 | 显示全部楼层
高手~高手~高手~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-13 05:25 , Processed in 0.117365 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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