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
WMI to get drive letter association with physical drive path, misses CDROMs
提问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_CDROMDrive
WMI class to access CD-ROM info. The code you have above is looking for physical drives in the Win32_DiskDrive
class, it excludes CD_ROM
我认为您需要使用Win32_CDROMDrive
WMI 类来访问 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