ドライブレターからその接続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

流れとしては、

  1. 物理ドライブを列挙する
  2. それぞれのパーティション情報を取得する
  3. パーティションに対応する論理ディスク情報を取得する
  4. 論理ディスク情報にあるドライブレターをキーに、物理ドライブのI/Fを格納する


GetInterfaceType関数は、連想配列から取り出すだけ。


なお、SATAIDEと出ました。
USB接続のCDドライブとかもUSBと出そうで怖いです。
drivesのMediaTypeも見るべきかもしれません。


InterfaceTypeしか取得していませんが、他にもいろいろ取れそうです。
論理ドライブの全容量と空きサイズとか、モデル名とか。
使うUSBメモリーが決まっているのなら、drivesのSerialNumberを使うのも手。

安全な取り外し

メモです。

rundll32 shell32.dll Control_RunDLL hotplug.dll

「UnplugDrive Portable」が何をやっているのか気になるところ。