1

すべてのリムーバブル ドライブの文字を変数に格納する Vb スクリプトがあります。ご存じのとおり、フロッピー ドライブと USB ドライブの両方が含まれています。それらを分離したいのです。つまり、USB ドライブの文字を変数とフロッピー ドライブに格納したいということです。別の変数に、

スクリプトは次のとおりです。

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk")

Removable = ""
For Each objDisk in colDisks
  if objDisk.DriveType = 2 then
    if Removable > "" then
      Removable = Removable & ";"
    end if
    Removable = Removable & objDisk.DeviceID & "\"
  end if
Next

VBScript を呼び出せるソフトウェアを使用しています。しかし、それは私が投稿したようなある種のものしかサポートしていません。では、どうすれば私が言ったことを行うことができますか?

前もって感謝します。

4

2 に答える 2

2

objDisk.MediaType を確認してください。ここに MediaTypes のリストがあります。一見、MediaType 1 ... 10 は「通常の」フロッピーを示します。私の(仮想)マシンでの簡単なチェックでは、USB ドライブの MediaType が Null であることが示されたので(不明の場合はゼロでさえありません)、注意が必要です。もう一度見てみましょう (注意して話します): ほとんどの定義されたメディア タイプはフロッピーを識別します (中にはエキゾチックなものもあります)。ところで - USB フロッピードライブはどうですか?


「実際の」コンピューターでテストできないため、次のコードを再確認する必要があります。

Const cnRemovableDisk =  2
Const cnMTypeUnknown  =  0
Const cnMTypeNoFloppy = 11
Const cnMTypeFixedHD  = 12
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 Removable     : Removable = ""
Dim Floppy        : Floppy    = ""
Dim USBDrive      : USBDrive  = ""
Dim objDisk
For Each objDisk in colDisks
  If objDisk.DriveType = cnRemovableDisk Then
     Removable = Removable & ";" & objDisk.DeviceID & "\"
     Select Case True
       Case IsNull( objDisk.MediaType )
          WScript.Echo objDisk.DeviceID, "has MediaType null - assuming USB Drive."
          USBDrive = USBDrive & ";" & objDisk.DeviceID & "\"
       Case objDisk.MediaType = cnMTypeNoFloppy
          WScript.Echo objDisk.DeviceID, "has MediaType 11 - assuming USB Drive."
          USBDrive = USBDrive & ";" & objDisk.DeviceID & "\"
       Case objDisk.MediaType = cnMTypeUnknown
          WScript.Echo objDisk.DeviceID, "has MediaType 0 - assuming USB Drive."
          USBDrive = USBDrive & ";" & objDisk.DeviceID & "\"
       Case objDisk.MediaType = cnMTypeFixedHD
          WScript.Echo objDisk.DeviceID, "has MediaType 12 - how can this happen?"
       Case Else
          WScript.Echo objDisk.DeviceID, "has MediaType", objDisk.MediaType, " - surely some kind of floppy."
          Floppy   = Floppy   & ";" & objDisk.DeviceID & "\"
     End Select
  End If
Next
Removable = Mid( Removable, 2 )
Floppy    = Mid( Floppy   , 2 )
USBDrive  = Mid( USBDrive , 2 )
WScript.Echo "Removable:", Removable
WScript.Echo "Floppy:   ", Floppy
WScript.Echo "USBDrive: ", USBDrive

私の出力は次のとおりです。

A: has MediaType 5  - surely some kind of floppy.
F: has MediaType null - assuming USB Drive.
Removable: A:\;F:\
Floppy:    A:\
USBDrive:  F:\

私の USBDrive の null MediaType は異常な事故かもしれません。「Select Case True」制御構造を使用して、MediaType の評価を簡単に調整できるようにしました。VBScript は、最初の true になるまで Cases の条件をテストし、対応するステートメントを実行し、End Select に「ブレーク」します。そのため、特殊なケースの追加やケースの並べ替えは簡単です。 IsNull チェックを最初の位置に置いておくだけです。

于 2011-08-11T08:48:32.057 に答える