2

ローカルのハード ドライブ文字を検出する 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

ありがとう、

4

1 に答える 1

4

私はしたいです

  1. WMI の代わりに FSO を使用する
  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
于 2011-08-06T08:31:26.580 に答える