vbscriptdrives

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,


Solution

  • I would prefer to

    1. use the FSO instead of WMI
    2. have the drives in a useable collection instead of a string
    3. 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