ou67169488 发表于 2022-9-14 15:53:10

关于获取硬盘信息的一些疑问。

本帖最后由 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,怎么样做才能保证我们获取到的是主系统盘呢?

caaooo 发表于 2022-9-19 14:33:29

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)

caaooo 发表于 2022-9-14 16:59:45

ou67169488 发表于 2022-9-14 16:44
是的,我知道这是个集合,但是顺序会变化。怎么去判断哪个是主硬盘呢?

我刚查了一下

Windows识别的磁盘编号取决于磁盘初始化完成的时间点。如果磁盘初始化所需要的时间不一样,那么初始化完成快的硬盘编号就低。而磁盘编号这个属性并不是保存在Windows系统中,所以有可能每次启动都会变。微软说了这个变化不影响系统的运行。

按照这个说法,单用你这个判断"\\\\.\\PHYSICALDRIVE0"的方法是行不通了

自贡黄明儒 发表于 2022-9-14 17:33:56

本帖最后由 自贡黄明儒 于 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:\\")

自贡黄明儒 发表于 2022-9-14 16:00:03

这里,可以参考一下
http://bbs.mjtd.com/thread-185781-1-1.html?_dsign=103eb83a

ou67169488 发表于 2022-9-14 16:02:08

自贡黄明儒 发表于 2022-9-14 16:00
这里,可以参考一下
http://bbs.mjtd.com/thread-185781-1-1.html?_dsign=103eb83a

谢谢大佬的答疑,不过我这个问题主要是诱惑硬盘的主硬盘信息会变化,想找到解决方案。

自贡黄明儒 发表于 2022-9-14 16:12:15

ou67169488 发表于 2022-9-14 16:02
谢谢大佬的答疑,不过我这个问题主要是诱惑硬盘的主硬盘信息会变化,想找到解决方案。

不知道是哪个 写的。你可以参考一下

caaooo 发表于 2022-9-14 16:31:55

这里主要的问题是,你的程序中定义的LOX在多硬盘的时候其实得到的是个类似“集合”,相当于多硬盘的信息都在LOX中,需要用类似(setq d (cons x d))的方法分解出来,然后在判断哪个是主硬盘,最后再得到主硬盘的信息

ou67169488 发表于 2022-9-14 16:44:50

caaooo 发表于 2022-9-14 16:31
这里主要的问题是,你的程序中定义的LOX在多硬盘的时候其实得到的是个类似“集合”,相当于多硬盘的信息都 ...

是的,我知道这是个集合,但是顺序会变化。怎么去判断哪个是主硬盘呢?

ou67169488 发表于 2022-9-14 16:46:40

自贡黄明儒 发表于 2022-9-14 16:12
不知道是哪个 写的。你可以参考一下

这个获取的信息比我的全面一点,不过硬盘顺序是一样的,还是会变化。

baitang36 发表于 2022-9-14 18:34:50

既然顺序能变,那就不用顺序。把所有的都读出来,判断想要的东西是否在里面
页: [1] 2
查看完整版本: 关于获取硬盘信息的一些疑问。