开发者

Detecting Windows Drive via VBScript

开发者 https://www.devze.com 2023-03-26 02:37 出处:网络
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 wi

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

  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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号