ac5474012 发表于 2009-6-9 16:54:26

检测硬盘大小并记录到ini

本帖最后由 ac5474012 于 2009-6-10 09:01 编辑

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


$cppf = DriveGetDrive("FIXED")
If Not @error Then
        ;MsgBox(4096, "", "找到 " & $cppf & " 个驱动器")
        For $i = 1 To $cppf
                ;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

lynfr8 发表于 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
                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
                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有时候,细细琢磨帮助文件的定义是非常有帮助的...

kn007 发表于 2009-6-9 18:30:58

2# lynfr8


高人那!!!、


楼主的慢死了

相反lynfr8的,又快有好,实力的差别

kn007 发表于 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
                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]
查看完整版本: 检测硬盘大小并记录到ini