关于获取硬盘信息的一些疑问。
本帖最后由 ou67169488 于 2022-9-14 16:04 编辑(DEFUN PHYHAR (/ RET SERX OBJW LCCON LOX)
(VL-LOAD-COM)
(SETQ SERX '())
(IF (SETQ OBJW (VLAX-CREATE-OBJECT "wbemScripting.SwbemLocator"))
(PROGN
(SETQ LCCON (VLAX-INVOKE OBJW 'CONNECTSERVER "." "\\root\\cimv2" "" ""
"" "" 128 NIL
)
)
(SETQ LOX (VLAX-INVOKE LCCON 'EXECQUERY "Select SerialNumber,Tag from Win32_PhysicalMedia"))
(VLAX-FOR ITEM LOX (if (= (VLAX-GET ITEM 'TAG) "\\\\.\\PHYSICALDRIVE0")
(setq SERX (VLAX-GET ITEM 'SERIALNUMBER))
)
)
(VLAX-RELEASE-OBJECT LOX)
(VLAX-RELEASE-OBJECT LCCON)
(VLAX-RELEASE-OBJECT OBJW)
)
)
(PRINC)
)上面提取本机硬盘信息,但是在多硬盘的情况下PHYSICALDRIVE0可能会变化,比如昨天PHYSICALDRIVE0是硬盘1,第二天就变成了硬盘2,怎么样做才能保证我们获取到的是主系统盘呢?
ou67169488 发表于 2022-9-15 09:09
受教了,谢谢。
这几天忙,一直惦记着还有这个事情,我整理了一下代码,估计这个应该就是你想要的结果了
(setq a (vlax-create-object "wbemscripting.swbemlocator") b (vlax-invoke a 'connectserver))
(setq c (vlax-invoke b 'execquery "select * from win32_diskpartition"))
(vlax-for e c (if (/= (vlax-get e "bootable") 0) (setq d (vlax-get e "diskindex"))))
(setq f (vlax-invoke b 'execquery "select * from win32_diskdrive"))
(vlax-for e f (if (= (vlax-get e "index") d) (setq g (vlax-get e "serialnumber"))))
(princ g) ou67169488 发表于 2022-9-14 16:44
是的,我知道这是个集合,但是顺序会变化。怎么去判断哪个是主硬盘呢?
我刚查了一下
Windows识别的磁盘编号取决于磁盘初始化完成的时间点。如果磁盘初始化所需要的时间不一样,那么初始化完成快的硬盘编号就低。而磁盘编号这个属性并不是保存在Windows系统中,所以有可能每次启动都会变。微软说了这个变化不影响系统的运行。
按照这个说法,单用你这个判断"\\\\.\\PHYSICALDRIVE0"的方法是行不通了 本帖最后由 自贡黄明儒 于 2022-9-15 17:06 编辑
ou67169488 发表于 2022-9-14 16:46
这个获取的信息比我的全面一点,不过硬盘顺序是一样的,还是会变化。
再看这个(syz-read-disk-boot-sector "C:")
(syz-read-disk-boot-sector "C:")
http://bbs.mjtd.com/thread-184656-1-1.html?_dsign=427ed74f
;;[功能]盘符序列号
(tranf 'FIND_SERIALNUMBER);;==>T
(FIND_SERIALNUMBER "c:")
(FIND_SERIALNUMBER "D:\\")
这里,可以参考一下
http://bbs.mjtd.com/thread-185781-1-1.html?_dsign=103eb83a 自贡黄明儒 发表于 2022-9-14 16:00
这里,可以参考一下
http://bbs.mjtd.com/thread-185781-1-1.html?_dsign=103eb83a
谢谢大佬的答疑,不过我这个问题主要是诱惑硬盘的主硬盘信息会变化,想找到解决方案。 ou67169488 发表于 2022-9-14 16:02
谢谢大佬的答疑,不过我这个问题主要是诱惑硬盘的主硬盘信息会变化,想找到解决方案。
不知道是哪个 写的。你可以参考一下 这里主要的问题是,你的程序中定义的LOX在多硬盘的时候其实得到的是个类似“集合”,相当于多硬盘的信息都在LOX中,需要用类似(setq d (cons x d))的方法分解出来,然后在判断哪个是主硬盘,最后再得到主硬盘的信息 caaooo 发表于 2022-9-14 16:31
这里主要的问题是,你的程序中定义的LOX在多硬盘的时候其实得到的是个类似“集合”,相当于多硬盘的信息都 ...
是的,我知道这是个集合,但是顺序会变化。怎么去判断哪个是主硬盘呢? 自贡黄明儒 发表于 2022-9-14 16:12
不知道是哪个 写的。你可以参考一下
这个获取的信息比我的全面一点,不过硬盘顺序是一样的,还是会变化。 既然顺序能变,那就不用顺序。把所有的都读出来,判断想要的东西是否在里面
页:
[1]
2