Detecting Windows Drive via VBScript
I have a VBScript which detects local hard drive letters and it will store them some where. Now I want to remove the Windows Drive from it. I mean first it finds all local hard drives, then detects windows drive and remove it from local hard drives list and then store them in the target variable. How to do it?
Here is the VBScript:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery 开发者_开发技巧_
("Select * from Win32_LogicalDisk")
drives = ""
For Each objDisk in colDisks
if objDisk.DriveType = 3 then
if drives > "" then
drives = drives & ";"
end if
drives = drives & objDisk.DeviceID & "\"
end if
Next
Thanks,
I would prefer to
- use the FSO instead of WMI
- have the drives in a useable collection instead of a string
- not putting the system drive in the collection instead of removing it later
So:
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
output:
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
ADDED:
I doubt that you can't do it yourself, but anyway:
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
精彩评论