我宁愿
- 使用 FSO 而不是 WMI
- 将驱动器放在可用的集合中而不是字符串中
- 不要将系统驱动器放入集合中,而是稍后将其删除
所以:
Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" )
Dim dicDTypes : Set dicDTypes = buildDicMKV( _
vbTextCompare, Split( "0 1 2 3 4 5" ), Split( "Unknown Removable Fixed Network CD-ROM RAM-Disk" ) _
)
Dim dicDrives : Set dicDrives = CreateObject( "Scripting.Dictionary" )
Dim oWSH : Set oWSH = CreateObject( "WScript.Shell" )
Dim sSysDir : sSysDir = oWSH.Environment( "PROCESS" )( "SYSTEMROOT" )
WScript.Echo "sSysDir", sSysDir
Dim sSysDrive : sSysDrive = goFS.GetDriveName( sSysDir )
WScript.Echo "sSysDrive", sSysDrive
Dim sSDLetter : sSDLetter = Left( sSysDrive, 1 )
WScript.Echo "sSDLetter", sSDLetter
Dim oDrive
For Each oDrive In goFS.Drives
WScript.Echo oDrive.DriveLetter, oDrive.DriveType, dicDTypes( CStr( oDrive.DriveType ) )
If "Fixed" = dicDTypes( CStr( oDrive.DriveType ) ) _
And sSDLetter <> oDrive.DriveLetter Then
Set dicDrives( oDrive.DriveLetter ) = oDrive
End If
Next
WScript.Echo "------------------"
Dim sDrive
For Each sDrive In dicDrives.Keys
Set oDrive = dicDrives( sDrive )
WScript.Echo oDrive.DriveLetter, oDrive.DriveType, dicDTypes( CStr( oDrive.DriveType ) )
Next
Function buildDicMKV( vbCompMode, aKeys, aValues )
Set buildDicMKV = CreateObject( "Scripting.Dictionary" )
' compare
' Optional. If provided, compare is a value representing the comparison mode.
' Acceptable values are 0 (Binary), 1 (Text), 2 (Database). Values greater than
' 2 can be used to refer to comparisons using specific Locale IDs (LCID).
buildDicMKV.CompareMode = vbCompMode
Dim nIdx
For nIdx = 0 To UBound( aKeys )
buildDicMKV.Add aKeys( nIdx ), aValues( nIdx )
Next
End Function
输出:
sSysDir C:\WINDOWS
sSysDrive C:
sSDLetter C
A 1 Removable
C 2 Fixed
E 3 Network
M 3 Network
X 2 Fixed
------------------
X 2 Fixed
添加:
我怀疑你不能自己做,但无论如何:
Dim sSysDrive : sSysDrive = CreateObject( "Scripting.FileSystemObject" ) _
.GetDriveName( _
CreateObject( "WScript.Shell" ).Environment( "PROCESS" )( "SYSTEMROOT" ) )
Dim strComputer : strComputer = "."
Dim objWMIService : Set objWMIService = GetObject( "winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2" )
Dim colDisks
Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk")
Dim drives : drives = ""
Dim objDisk
For Each objDisk in colDisks
If objDisk.DriveType = 3 _
And objDisk.DeviceID <> sSysDrive Then
If drives > "" Then
drives = drives & ";"
End If
drives = drives & objDisk.DeviceID & "\"
End if
Next
WScript.Echo drives