找回密码
 加入
搜索
查看: 1428|回复: 3

检测硬盘大小并记录到ini

[复制链接]
发表于 2009-6-9 16:54:26 | 显示全部楼层 |阅读模式
本帖最后由 ac5474012 于 2009-6-10 09:01 编辑

问题很简单,如果去掉了下面中的两个Sleep(1000)程序就只会记录一个硬盘的大小。这是为什么?如何解决?


$cppf = DriveGetDrive("FIXED")
If Not @error Then
        ;MsgBox(4096, "", "找到 " & $cppf[0] & " 个驱动器")
        For $i = 1 To $cppf[0]
                ;MsgBox(4096, "驱动器 " & $i, $cppf[$i])
                Local $pf
                $pf = $cppf[$i]
                ;MsgBox(4096, "驱动器的盘符样子 " ,$pf&"\")
                $kj = DriveSpaceTotal($pf & "\")
                Sleep(1000)
                ;MsgBox(4096, $pf & " 的空间:", $kj & " MB")
                $sxdx = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & ":" & @MIN & ":" & @SEC
                $kykj = DriveSpaceFree($pf & "\")
                Sleep(1000)
                ;MsgBox(4096, $pf & " 的可用空间:", $kykj & " MB")
                IniWrite(@ScriptDir & "\空间.ini", "磁盘空间", "检测时间 " & $sxdx, $pf & "盘 全部空间为: " & $kj & " 可用空间为: " & $kykj)
        Next
EndIf
发表于 2009-6-9 18:15:11 | 显示全部楼层
本帖最后由 lynfr8 于 2009-6-9 18:20 编辑

你对脚本运算时间和系统时间还有IniWrite的用法理解不够深

1.
IniWrite ( "文件名", "字段名", "关键字", "值" ) 
其中参数‘值’为要写入/修改的数值.
当目标文件并不存在,则程序将自动创建该文件,关键字和字段将被添加到后面部分

好好读读这句话:
可得知IniWrite是先写入关键字和字段,然后再读字段,再根据字段写入相应的‘值’
如果字段是存在的话,
IniWrite只会执行修改‘值’,而不会再建同样一个字段再写入值(好好理解这里!)
不信?检测下就知道了
$cppf = DriveGetDrive("FIXED")
$sxdx = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & ":" & @MIN & ":" & @SEC
If Not @error Then
        For $i = 1 To $cppf[0]
                Local $pf
                $pf = $cppf[$i]
                $kj = DriveSpaceTotal($pf & "")
                Sleep(1000)        
                $kykj = DriveSpaceFree($pf & "")
                Sleep(1000)
                IniWrite(@ScriptDir & "\空间.ini", "磁盘空间" , "检测时间 ", $pf & "盘 全部空间为: " & $kj & " 可用空间为: " & $kykj)
        Next
 EndIf
看,是不是加了sleep都没用,还是只能获得最后一个盘符的检测数据?

看回到你的代码:"检测时间 " & $sxdx,$sxdx是你获取的系统时间,精确到秒了
在循环语句里,你的思路是循环获取系统时间然后和‘检测时间’一起写入字段,然后和相应的值写入ini,思路是对的
问题就出现在脚本的循环语句运算速度是非常快的,比你获得的系统时间秒还要快得多了
想想cpu浮点运算速度就知道了,如果是双核的甚至是8核的就更不用说了
这样你的循环语句获得的系统时间是相同的,写入的字段也是一样的
自然IniWrite就只执行‘值’的修改,导致你得到最后一个盘符的检测数据了!

但是当你就加入sleep之后,获取的系统时间就不同了,
只要slepp(100)1秒以上IniWrite都会执行‘值’的写入而不是修改,
因为你的字段已经可以根据系统时间区分开来了

2.不加sleep的解决方法
关键:修改IniWrite语句中的字段
IniWrite(@ScriptDir & "\空间.ini", "磁盘空间" , $i&"检测时间 "& $sxdx, $pf & "盘 全部空间为: " & $kj & " 可用空间为: " & $kykj)
或者用比秒更精确的TimerDiff来区分时间
$cppf = DriveGetDrive("FIXED")
$sxdx = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & ":" & @MIN & ":" & @SEC
If Not @error Then
        For $i = 1 To $cppf[0]
                Local $pf,$dif
                $begin = TimerInit()
                $pf = $cppf[$i]
                $kj = DriveSpaceTotal($pf & "")              
                $kykj = DriveSpaceFree($pf & "")
                $dif = TimerDiff($begin)
                IniWrite(@ScriptDir & "\空间.ini", "磁盘空间" , "检测时间 "&$sxdx&$dif, $pf & "盘 全部空间为: " & $kj & " 可用空间为: " & $kykj)
        Next
        EndIf
有时候,细细琢磨帮助文件的定义是非常有帮助的...

评分

参与人数 1金钱 +10 贡献 +5 收起 理由
ac5474012 + 10 + 5 哥们你说的太详细了~

查看全部评分

发表于 2009-6-9 18:30:58 | 显示全部楼层
2# lynfr8


高人那!!!、


楼主的慢死了

相反lynfr8的,又快有好,实力的差别
发表于 2009-6-9 18:40:42 | 显示全部楼层
稍微改一下,这样美观了

$cppf = DriveGetDrive("FIXED")
$sxdx = @YEAR & "-" & @MON & "-" & @MDAY & "_" & @HOUR & ":" & @MIN & ":" & @SEC & "|"
If Not @error Then
        For $i = 1 To $cppf[0]
                Local $pf,$dif
                $begin = TimerInit()
                $pf = $cppf[$i]
                $kj = DriveSpaceTotal($pf & "\")              
                $kykj = DriveSpaceFree($pf & "\")
                $dif = TimerDiff($begin)
                IniWrite(@ScriptDir & "\空间.txt", "磁盘空间" , "检测时间 "&$sxdx&"反应时间 "&$dif, $pf & "盘 全部空间为: " & $kj & " 可用空间为: " & $kykj)
        Next
        EndIf

评分

参与人数 1金钱 +5 贡献 +2 收起 理由
ac5474012 + 5 + 2 多谢

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-25 05:00 , Processed in 0.093320 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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