kn007 发表于 2009-10-24 23:41:09

如何得到第一硬盘的最后分区?

比如第一硬盘有4个分区,最后一个分区盘符为F:,如何得到“F:”呢?
第2硬盘的最后分区呢,第3呢,·······,第n呢?

sanmoking 发表于 2009-10-24 23:41:10

本帖最后由 sanmoking 于 2009-10-25 02:04 编辑

$fini = @TempDir&"\d.ini"
_test()
_last()
FileDelete($fini)

Func _test()
$strComputer = "localhost"
$objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
$colDiskDrives = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive")
For $objDrive In $colDiskDrives
        $strDeviceID = StringReplace($objDrive.DeviceID, "\", "\\")
    $colPartitions = $objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & $strDeviceID & """} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
IniWrite ($fini, "磁盘","磁盘列表",IniRead($fini, "磁盘","磁盘列表","")&StringRight ($strDeviceID,1))        
IniWrite ($fini, "磁盘","HD"&StringRight ($strDeviceID,1),$objDrive.Caption)       
    For $objPartition In $colPartitions
       $colLogicalDisks = $objWMIService.ExecQuery ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & $objPartition.DeviceID & """} WHERE AssocClass = Win32_LogicalDiskToPartition")
      For $objLogicalDisk In $colLogicalDisks                       
                IniWrite ($fini, "磁盘",$objDrive.Caption,IniRead($fini, "磁盘",$objDrive.Caption,"")&StringReplace($objLogicalDisk.DeviceID, ":", ""))
      Next
                Next
Next
EndFunc
Func _last()       
$dd = IniRead($fini,"磁盘","磁盘列表","")
$yingpanshu = StringLen($dd) ;磁盘数目
$ttt=""
for $i = 1 to $yingpanshu
        $yingpanxuhao = "HD"&StringMid($dd,$i,1);磁盘序号
        $yingpanname=IniRead($fini,"磁盘",$yingpanxuhao,"")       ;磁盘名称
        $yingpanfenqu=IniRead($fini,"磁盘",$yingpanname,"")       ;磁盘
        $fenqushumu=StringLen($yingpanfenqu);分区数目
        $lastfenqu=StringRight ($yingpanfenqu,1);最后一个分区
        $ttt=$ttt&"磁盘【"&$yingpanxuhao&":"&$yingpanname&"】上有【"&$yingpanfenqu&"】共"&$fenqushumu&"个分区,最后一个分区是【"&$lastfenqu&"】。"&@CRLF
Next
MsgBox(0,"一共发现"&$yingpanshu&"块磁盘","一共发现"&$yingpanshu&"块磁盘,其中:"&@CRLF&$ttt)
EndFunc
隐藏分区算吗?
pusofalse 发表于 2009-10-25 01:30 http://www.autoitx.com/images/common/back.gif



如果仅仅是隐藏了盘符而显不出来,在地址栏输入盘符还能打开的那种隐藏,是可以识别的;

但是直接删除了盘符的那种隐藏(比如利用磁盘管理器删除某个分区的盘符),就没办法通过盘符的字母来识别了,因为根本就没有那个盘符的字母(C:D:E:……)怎么来识别。。。。。

pusofalse 发表于 2009-10-25 01:30:10

隐藏分区算吗?

破帽遮颜 发表于 2009-10-25 13:50:10

pusofalse,有办法将笔记本的隐藏分区找出来不?

pusofalse 发表于 2009-10-25 20:38:07

楼主所说的“最后”是以什么为参照的呢?按照字母顺序,还是分区时的顺序?在分区时,可能先分了F,再分了E,这种情况下,F是最后分区,还是E是最后分区?
Re 2#:
不一定要用字母标示每个分区。存储卷的设备ID或卷名称也是唯一的,也可以用来标示一个分区。

Re 4#:
引导记录里记录着分区状况,读分区表应该能判断出来,不过没有测试~

kn007 发表于 2009-10-26 08:56:50

没试过有先F后E。。。。。不知要怎么分出来。。。。码字时突然明白你的意思了。。。我也会。。。。这时F是最后分区,以我习惯来说,按实际的话就是E是最后。。。。不过如果出现这种情况,能不能以F来作为最后分区识别出来?要是想识别为E要怎么办呢?

我也有这种情况,不过已经很多年了,当时是一个15G硬盘,那时已经很大了。。。就是先有后面分区,再有前面分区(后面前面指的是字母)

其实,我就是想判断下第一硬盘的最后个分区,然后copy个ghost。。。。。。。


隐藏分区我好像用不着,如果大大能写出来,让大家学习学习,那是最好。。。。
隐藏分区一般我都是直接把他开刀格掉,,,浪费空间,只要你保护的好,其实不用隐藏分区。。。

guland 发表于 2009-10-26 10:05:37

$ver = DriveGetDrive("FIXED")
$i=$ver
MsgBox(0, "硬盘检测", "您的最后一个盘是"&StringUpper ($ver[$i]) )

这是别人的方法,不知道你有没有试过

kn007 发表于 2009-10-26 10:54:17

等等看还有没有其他解决法子,如果没有,就评选sanmoking 为最佳答案

sanmoking 发表于 2009-10-26 17:35:38

本帖最后由 sanmoking 于 2009-10-26 17:58 编辑

深度技术 小兵作品的ghost安装工具是按
hd0,1
hd0,2
hd0,3
hd1,1
hd1,2
……
这样来表示分区的,汗,专业的名词我也说不出来。。。。当给楼主提示一下好了。。。。wmi我也不会,不知道该怎么去取这个值。。。。。我理解的意思就是他是按实际的分区来排号的,而不是按分区字母来的(所以说 ghost似乎只需要知道每个硬盘有几个分区就好了,比如第一硬盘有4个分区,那就用【hd0,4】表示就行了,不用知道分区的字母。。。不知道我的理解对不?)。。。。ghost里面显示ntfs分区也是这样排序的。。。

kn007 发表于 2009-10-26 17:43:43

。。。不知有哪位高手知道,能给出来让大家学习学习

pusofalse 发表于 2009-10-26 18:59:41

获取物理磁盘信息#include <SetupApi.au3>
$aPhysDisks = _CM_Enumerate_Physical_Disks()
_Arraydisplay($aPhysDisks)
检测隐藏分区#include <SetupApi.au3>

Local $aList, $sDevicePath, $sDrive
Local $sVolume, $iDiskNum, $aHidden

$aList = _CM_Get_Device_Interface_List_Ex(0, $GUID_DEVINTERFACE_VOLUME)
For $i = 1 To $aList
        $sVolume = _CM_Get_Volume_Name($aList[$i] & "\")
        $sDrive = _CM_Get_Volume_Path($sVolume)
        If $sDrive = "" Then
                $sDevicePath = StringTrimLeft($aList[$i], 4)
                $iDiskNum = _CM_Get_Drive_Disk_Number($sDevicePath)
                If $iDiskNum < 0 Then ContinueLoop
                $aHidden += 1
                Redim $aHidden[$aHidden + 1]
                $aHidden[$aHidden] = "\\.\PhysicalDrive" & $iDiskNum
                $aHidden[$aHidden] = $sVolume
                $aHidden[$aHidden] = $aList[$i]
        EndIf
Next
_Arraydisplay($aHidden)

kn007 发表于 2009-10-26 22:05:20

头文件:http://www.autoitx.com/forum.php?mod=viewthread&tid=10543&page=1&fromuid=7644076#pid98820

netegg 发表于 2009-10-28 22:31:24

winapiex里好像有这个函数,印象不是很深

kn007 发表于 2009-10-28 22:46:59

#include <WinAPIEx.au3>
的哪个啊?

这好像还没汉化呢

kn007 发表于 2009-10-28 22:49:51

这函数也挺强大的,不过好像要新版才有。。。。郁闷

我是 Autoit 3.2.13.12 第一汉化版
页: [1] 2
查看完整版本: 如何得到第一硬盘的最后分区?