vba WMI 获取与物理驱动器路径的驱动器号关联,错过 CDROM

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9346320/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-11 15:16:12  来源:igfitidea点击:

WMI to get drive letter association with physical drive path, misses CDROMs

vbavbscriptwmi

提问by ahmd0

I'm running the following WMI script to get the associations between drive letters and physical drives on the system, but for some reason it omits CDROMs/DVD-ROMs. Can someone tell me how to get those as well?

我正在运行以下 WMI 脚本来获取系统上驱动器号和物理驱动器之间的关联,但由于某种原因它省略了 CDROM/DVD-ROM。有人可以告诉我如何获得这些吗?

ComputerName = "."
Set wmiServices = GetObject _
    ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery _
    ("SELECT DeviceID FROM Win32_DiskDrive")

For Each wmiDiskDrive In wmiDiskDrives
    strEscapedDeviceID = _
        Replace(wmiDiskDrive.DeviceID, "\", "\", 1, -1, vbTextCompare)
    Set wmiDiskPartitions = wmiServices.ExecQuery _
        ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & _
            strEscapedDeviceID & """} WHERE " & _
                "AssocClass = Win32_DiskDriveToDiskPartition")

    For Each wmiDiskPartition In wmiDiskPartitions
        Set wmiLogicalDisks = wmiServices.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _
                wmiDiskPartition.DeviceID & """} WHERE " & _
                    "AssocClass = Win32_LogicalDiskToPartition")

        For Each wmiLogicalDisk In wmiLogicalDisks
            WScript.Echo wmiLogicalDisk.DeviceID & " = " & wmiDiskDrive.DeviceID
        Next
    Next
Next

回答by Nilpo

Considering all of the comments thus far, here is a script that adds the capability to list CD-Rom drives.

考虑到迄今为止的所有评论,这里有一个脚本,它添加了列出 CD-Rom 驱动器的功能。

ComputerName = "."

Set dictDrives = CreateObject("Scripting.Dictionary")
Set listDriveLetters = CreateObject("System.Collections.ArrayList")

Set wmiServices = GetObject _
    ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery _
    ("SELECT DeviceID FROM Win32_DiskDrive")

For Each wmiDiskDrive In wmiDiskDrives
    strEscapedDeviceID = Replace(wmiDiskDrive.DeviceID, "\", "\", 1, -1, vbTextCompare)
    Set wmiDiskPartitions = wmiServices.ExecQuery _
        ("ASSOCIATORS OF {Win32_DiskDrive.DeviceID=""" & _
            strEscapedDeviceID & """} WHERE " & _
                "AssocClass = Win32_DiskDriveToDiskPartition")

    For Each wmiDiskPartition In wmiDiskPartitions
        Set wmiLogicalDisks = wmiServices.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & _
                wmiDiskPartition.DeviceID & """} WHERE " & _
                    "AssocClass = Win32_LogicalDiskToPartition")

        For Each wmiLogicalDisk In wmiLogicalDisks
            listDriveLetters.Add wmiLogicalDisk.DeviceID
            dictDrives.Add wmiLogicalDisk.DeviceID, wmiDiskDrive.DeviceID
        Next
    Next
Next

Set wmiCDROMDrives = wmiServices.ExecQuery _
    ("Select DeviceID, Drive, MediaLoaded from Win32_CDROMDrive")

For Each wmiCDROMDrive in wmiCDROMDrives
    If wmiCDROMDrive.MediaLoaded Then          ' Only show drives with inserted media
        listDriveLetters.Add wmiCDROMDrive.Drive
        dictDrives.Add wmiCDROMDrive.Drive, wmiCDROMDrive.DeviceID
    End If
Next

listDriveLetters.Sort                          ' List the drives in alphabetical order

For Each strDriveLetter in listDriveLetters
    WScript.Echo strDriveLetter & " = " & dictDrives.Item(strDriveLetter)
Next

回答by brettdj

I think you wouldn need to use the Win32_CDROMDriveWMI class to access CD-ROM info. The code you have above is looking for physical drives in the Win32_DiskDriveclass, it excludes CD_ROM

我认为您需要使用Win32_CDROMDriveWMI 类来访问 CD-ROM 信息。您上面的代码正在寻找类中的物理驱动器Win32_DiskDrive,它不包括 CD_ROM

You could additional lines to get similar data - but not the same given CD-ROMs don't have the Partition characteristics that your current code does

您可以使用额外的行来获取类似的数据 - 但给定的 CD-ROM 不具有您当前代码所具有的分区特征

ComputerName = "."
Set wmiServices = GetObject _
                  ("winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
Set wmiDiskDrives = wmiServices.ExecQuery _
                    ("SELECT * FROM Win32_CDROMDrive")
For Each wmiDiskDrive In wmiDiskDrives
    MsgBox wmiDiskDrive.drive & "=" & wmiDiskDrive.DeviceID
Next

Instead I think this different VBS maydo what you want - the may part as I dont think the partition info is relevant to you.

相反,我认为这个不同的 VBS可能会做你想做的 - 可能是因为我认为分区信息与你无关。

vbsversion

vbs版本

Dim objFSO
Dim colDrives
Dim strOut
Dim strArray

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
strArray = Array("Unknown", "Removable", "Fixed", "Network", "CD-ROM", "RAM Disk")
On Error Resume Next
'File system errors for virtual drives
For Each objDrive In colDrives
    strOut = "Drive letter: " & objDrive.DriveLetter & vbNewLine
    strOut = strOut & ("Drive type: " & strArray(objDrive.DriveType) & vbNewLine)
    strOut = strOut & ("File system: " & objDrive.FileSystem & vbNewLine)
    strOut = strOut & ("Path: " & objDrive.Path)
    wscript.echo strOut
Next
On Error GoTo 0

vbaversion

vba版本

Sub Test()
Dim objFSO As Object
Dim colDrives As Object
Dim strOut As String
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
On Error Resume Next
'File system errors for virtual drives
For Each objDrive In colDrives
    strOut = "Drive letter: " & objDrive.DriveLetter & vbNewLine
    strOut = strOut & ("Drive type: " & Choose(objDrive.DriveType + 1, "Unknown", "Removable", "Fixed", "Network", "CD-ROM", "RAM Disk") & vbNewLine)
    strOut = strOut & ("File system: " & objDrive.FileSystem & vbNewLine)
    strOut = strOut & ("Path: " & objDrive.Path)
    MsgBox strOut
Next
On Error GoTo 0
End Sub