Обнаружение Windows Drive через VBScript - PullRequest
2 голосов
/ 06 августа 2011

У меня есть VBScript, который обнаруживает локальные буквы жесткого диска, и он будет хранить их где-то. Теперь я хочу удалить диск Windows с него. Я имею в виду, что сначала он находит все локальные жесткие диски, затем обнаруживает диск Windows и удаляет его из списка локальных жестких дисков, а затем сохраняет их в целевой переменной. Как это сделать?

Вот 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

Спасибо

1 Ответ

4 голосов
/ 06 августа 2011

Я бы предпочел

  1. использовать FSO вместо WMI
  2. содержит строку в пригодной для использования коллекции вместо строки
  3. не помещать системный диск в коллекцию вместо удаления это позже

Итак:

  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
...