求助!不知道哪里错了会重复写入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我也上传上来,附件如下:
像我这样就会覆盖.
IniWrite($sFile, '硬件信息', @ComputerName,'主板:' & _MbGet() & ',处理器:' & $cpuname & ' , 内存:' & $nc & ',显卡:' & $xx & ',声卡:' & $audio) 本帖最后由 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") 像我这样就会覆盖.
IniWrite($sFile, '硬件信息', @ComputerName,'主板:' & _MbGet() & ',处理器:' & $cpu ...
Alam 发表于 2012-6-25 18:16 http://www.autoitx.com/images/common/back.gif
虽然前面部份不会重复写入但是后面的还是会重复写入 目测似乎是那个黑块块字符造成的。。。应该$computername读取到的里面有特殊字符,存进【硬件.ini】之后 ...
sanmoking 发表于 2012-6-25 18:24 http://www.autoitx.com/images/common/back.gif
难道就没有办法完善解决了吗?555555555好不容易收集到适合自己用的代码眼看就要失败而告终了 回复 5# surongfu
把你的【硬件.ini】上传上来看一下,是什么字符搞的。。把他去掉就好了。。 本帖最后由 surongfu 于 2012-6-25 19:12 编辑
sanmoking 元老兄我已经上传硬件.rar Card name:\s(.*)
Description:\s(.*)
Processor:\s(.*)
Machine name:\s(.*)
这样的正则表达式都会捕捉到行末的回车符,即黑方块。造成Ini读写错误。将“(.*)”改为“(\V*)” 回复 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的配置 不过我觉得你ini的设置不是很合理。。
其实应该这样比较合理:
【硬件.ini】
[计算机名1]
主板=xxxx
显卡=xxxx
cpu=xxxx
[计算机名2]
主板=xxxx
显卡=xxxx
cpu=xxxx
回复 10# sanmoking
是不合理,但我比较笨只能通过我那样的格式才方便自己统计硬件信息嘿嘿 回复 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,取两边的特征字符中间的部分,对于不会正则的来说非常好用
,正则用不好,失之一点,差之千里。。。 回复 8# afan
原来是这样啊, 哈哈, 他们俩还在那里嘀咕呢! 回复 13# Alam
高手,见笑了。。。 高手~高手~高手~
页:
[1]
2