找回密码
 加入
搜索
查看: 4352|回复: 10

[AU3基础] 『已解决』请问如何使Autoit判断电脑有几个硬盘,和几个分区,还有硬盘类型?

  [复制链接]
发表于 2012-6-23 14:01:55 | 显示全部楼层 |阅读模式
本帖最后由 aassddffgg961 于 2012-6-23 17:20 编辑

比方说电脑有两个以上硬盘,每个硬盘又都有分区,请问要怎么让Autoit判断?查找帮助好像没看到有判断分区的代码,论坛好像也没搜索到。请高手指点下。谢谢。


以上问题基本解决,现在的问题是盘类型的检测,有时插入移动硬盘或者是VMware映射盘排除等。只检测电脑内置硬盘。谢谢。
发表于 2012-6-23 15:34:15 | 显示全部楼层
不知道lz如何查的帮助,还是不过臆想了一下

本帖子中包含更多资源

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

×
 楼主| 发表于 2012-6-23 15:52:51 | 显示全部楼层
好吧,我承认我很蹩脚,请问能否提示下命令行的关键词?另外有时插入移动盘或者是虚拟盘能否自动排除?只找电脑内置硬盘的所有分区?谢谢。
发表于 2012-6-23 16:10:53 | 显示全部楼层
点这里,监视硬盘分区的实例

至于多少个硬盘,楼主自己举一反三吧。
发表于 2012-6-23 16:19:48 | 显示全部楼层
本帖最后由 netegg 于 2012-6-23 16:22 编辑

#Include <WinAPIEx.au3>
_WinAPI_GetDriveNumber

盘类型没测试过
 楼主| 发表于 2012-6-23 16:39:08 | 显示全部楼层
谢谢楼上几位。坐等盘类型的例子。
发表于 2012-6-23 16:43:36 | 显示全部楼层
Local $aArray = DriveGetDrive("ALL")
If @error Then
        ; An error occurred when retrieving the drives.
        MsgBox(4096, "DriveGetDrive", "It appears an error occurred.")
Else
        For $i = 1 To $aArray[0]
                ; Show all the drives found and convert the drive letter to uppercase.
                MsgBox(4096, "DriveGetDrive", "Drive " & $i & "/" & $aArray[0] & ":" & @CRLF & StringUpper($aArray[$i]))
        Next
EndIf
 楼主| 发表于 2012-6-23 16:47:38 | 显示全部楼层
试了一下楼上的,但好像不能区分盘类型哦。不能排除移动盘。
发表于 2012-6-23 16:48:22 | 显示全部楼层
代码如下 原帖地址
GetPartionMsg("", 1)        ;GetPartionMsg 的第一个参数可以是 USB、IDE 等;如果不带任何参数,则是检测所有磁盘分区
                                                ;第二个参数可以是 1、0,1 表示 TRUE,0 表示 FALSE;如果第一个参数为空,则第二个必需为 1
 
Func GetPartionMsg($Interface, $b)
        $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
        $colItems = $objWMIService.ExecQuery ("Select * from Win32_LogicalDiskToPartition")
        $DiskInfo = ""
        $DiskInfoCombo = ""
        For $objItem In $colItems
                $DiskFH = StringLeft(StringRight($objItem.Dependent, 3), 2)
                $PartNum = QueryDiskNum($DiskFH)
                $PartMsg = QueryPartitionVolume($DiskFH)
                If $Interface <> "" Then
                        If $b = 1 Then
                                If StringMid($PartNum, 2, 3) = $Interface Then
                                        $DiskInfo = $DiskInfo & $PartNum & $DiskFH & $PartMsg & @CRLF
                                EndIf
                        ElseIf $b = 0 Then
                                If StringMid($PartNum, 2, 3) <> $Interface Then
                                        $DiskInfo = $DiskInfo & $PartNum & $DiskFH & $PartMsg & @CRLF
                                EndIf
                        EndIf
                Else
                        $DiskInfo = $DiskInfo & $PartNum & $DiskFH & $PartMsg & @CRLF
                EndIf
        Next
        MsgBox(64, "磁盘信息", $DiskInfo)
EndFunc   ;==>GetPartionMsg
 
Func QueryDiskInterface($n)
        $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
        $colItems = $objWMIService.ExecQuery ("Select * from Win32_DiskDrive Where Index=" & $n)
        For $objItem In $colItems
                Return $objItem.InterfaceType
        Next
EndFunc   ;==>QueryDiskInterface
 
Func QueryPartitionVolume($v)
        $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
        $colItems = $objWMIService.ExecQuery ("Select * from Win32_LogicalDisk Where DeviceID='" & $v & "'")
        For $objItem In $colItems
                Return $objItem.VolumeName & "" & $objItem.FileSystem & "_" & CalcKMG($objItem.Size) & "_" & $objItem.Description
        Next
EndFunc   ;==>QueryPartitionVolume
 
Func QueryDiskNum($d)
        $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
        $colItems = $objWMIService.ExecQuery ("Associators of {win32_LogicalDisk.DeviceID='" & $d & "'} where ResultClass = Win32_DiskPartition")
        For $colItem In $colItems
                Return "(" & QueryDiskInterface($colItem.DiskIndex) & ":hd" & $colItem.DiskIndex & ")" 
        Next
EndFunc   ;==>QueryDiskNum
 
Func CalcKMG($n)
        If $n < 1024 Then
                Return $n & "Byte" 
        ElseIf $n < 1048576 Then
                Return Round($n / 1024, 2) & "KB" 
        ElseIf $n < 1073741824 Then
                Return Round($n / 1048576, 2) & "MB" 
        Else
                Return Round($n / 1073741824, 2) & "GB" 
        EndIf
EndFunc   ;==>CalcKMG
发表于 2012-6-23 17:02:28 | 显示全部楼层
楼主说的“现在的问题是盘类型的检测,有时插入移动硬盘或者是VMware映射盘排除等。只检测电脑内置硬盘。谢谢。”
添加条件限制就行了。
看图
看到后面的类型了吧

本帖子中包含更多资源

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

×
 楼主| 发表于 2012-6-23 17:19:00 | 显示全部楼层
回复 10# zerobin


    谢谢了,还有一个疑问,使用于SATA硬盘吧?刚好我的电脑现在是IDE模式。。。无法试。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-1 07:29 , Processed in 0.101905 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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