ドライブレターからその接続I/Fを取得する
UWSCで書いてますが、WMIなので、いろんなところで適用可能です。
あと、モジュールのコンストラクタで全ドライブの情報を取得しているので、、、立ち上がり遅し。
スクリプト
DiskInfo.uws
OPTION EXPLICIT IFB GET_UWSC_NAME = "DiskInfo.uws" THEN PRINT DiskInfo.GetInterfaceType("C:") // 一応こう呼ぶ想定 PRINT DiskInfo.GetInterfaceType("C") // コロン付与もしてみた ENDIF MODULE DiskInfo HASHTBL _interfaceType FUNCTION GetInterfaceType(driveLetter) // driveLetterが1文字なら、:をつける IF LENGTH(driveLetter) = 1 THEN driveLetter = driveLetter + ":" RESULT = _interfaceType[driveLetter] FEND PROCEDURE DiskInfo Dim Locator = CreateOleObj("WbemScripting.SWbemLocator") Dim consvr = Locator.ConnectServer() Dim i, j, k, partitions[0], disks[0] Dim driveInfo = consvr.ExecQuery("Select * From Win32_DiskDrive") Dim driveNum = GetOleItem(driveInfo) - 1 Dim drives[driveNum] For i = 0 To driveNum drives[i] = ALL_OLE_ITEM[i] //PRINT drives[i].InterfaceType + " : " + drives[i].DeviceID Next For i = 0 To driveNum Dim partitionInfo = consvr.ExecQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drives[i].DeviceID + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition") Dim partitionNum = GetOleItem(partitionInfo) - 1 Resize(partitions, partitionNum) For j = 0 To partitionNum partitions[j] = ALL_OLE_ITEM[j] //PRINT drives[i].InterfaceType + " : " + drives[i].DeviceID + " : " + partitions[j].DeviceID Next For j = 0 To partitionNum Dim diskInfo = consvr.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + partitions[j].DeviceID + "'} WHERE AssocClass = Win32_LogicalDiskToPartition") Dim diskNum = GetOleItem(diskInfo) - 1 Resize(disks, diskNum) For k = 0 To diskNum disks[k] = ALL_OLE_ITEM[k] //PRINT drives[i].InterfaceType + " : " + drives[i].DeviceID + " : " + partitions[j].DeviceID + " : " + disks[k].DeviceID + " : " + disks[k].PNPDeviceID _interfaceType[disks[k].DeviceID] = drives[i].InterfaceType Next Next Next FEND ENDMODULE
流れとしては、
GetInterfaceType関数は、連想配列から取り出すだけ。
なお、SATAもIDEと出ました。
USB接続のCDドライブとかもUSBと出そうで怖いです。
drivesのMediaTypeも見るべきかもしれません。
InterfaceTypeしか取得していませんが、他にもいろいろ取れそうです。
論理ドライブの全容量と空きサイズとか、モデル名とか。
使うUSBメモリーが決まっているのなら、drivesのSerialNumberを使うのも手。
安全な取り外し
メモです。
rundll32 shell32.dll Control_RunDLL hotplug.dll
「UnplugDrive Portable」が何をやっているのか気になるところ。