- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 WMI 获取所有插入的 USB 磁盘制造商名称。该代码工作得很好,但我有一个问题,如何确定某个磁盘具有的驱动器号...我只能获取设备名称,例如
(\\.\PhysicalDrive1) ...我如何将其翻译为普通驱动器号?
最佳答案
如果您获得类似 \\.\PHYSICALDRIVE1
的值,则表示您正在使用 Win32_DiskDrive
wmi 类和 DeviceID
Property ,因此为了获取驱动器盘符您必须使用 ASSOCIATORS 类,它将在包含您正在查找的信息 (Win32_LogicalDisk
) 的 wmi 类和您正在使用的类 (Win32_DiskDrive
) 之间创建链接。
所以你必须做这样的事情
Win32_DiskDrive
-> Win32_DiskDriveToDiskPartition -> Win32_DiskPartition -> Win32_LogicalDiskToPartition -> Win32_LogicalDisk
检查此示例函数
{$APPTYPE CONSOLE}
uses
SysUtils,
ActiveX,
ComObj,
Variants;
function DeviceIDToDrive(const ADeviceID : string) : string;
var
FSWbemLocator : OLEVariant;
objWMIService : OLEVariant;
colLogicalDisks: OLEVariant;
colPartitions : OLEVariant;
objPartition : OLEVariant;
objLogicalDisk : OLEVariant;
oEnumPartition : IEnumvariant;
oEnumLogical : IEnumvariant;
iValue : LongWord;
DeviceID : string;
begin;
Result:='';
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
objWMIService := FSWbemLocator.ConnectServer('localhost', 'root\CIMV2', '', '');
DeviceID := StringReplace(ADeviceID,'\','\\',[rfReplaceAll]); //Escape the `\` chars in the DeviceID value because the '\' is a reserved character in WMI.
colPartitions := objWMIService.ExecQuery(Format('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="%s"} WHERE AssocClass = Win32_DiskDriveToDiskPartition',[DeviceID]));//link the Win32_DiskDrive class with the Win32_DiskDriveToDiskPartition class
oEnumPartition := IUnknown(colPartitions._NewEnum) as IEnumVariant;
while oEnumPartition.Next(1, objPartition, iValue) = 0 do
begin
if not VarIsNull(objPartition.DeviceID) then
begin
colLogicalDisks := objWMIService.ExecQuery('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="'+VarToStr(objPartition.DeviceID)+'"} WHERE AssocClass = Win32_LogicalDiskToPartition'); //link the Win32_DiskPartition class with theWin32_LogicalDiskToPartition class.
oEnumLogical := IUnknown(colLogicalDisks._NewEnum) as IEnumVariant;
if oEnumLogical.Next(1, objLogicalDisk, iValue) = 0 then
begin
Result:=objLogicalDisk.DeviceID;
objLogicalDisk:=Unassigned;
end;
end;
objPartition:=Unassigned;
end;
end;
begin
try
CoInitialize(nil);
try
Writeln(DeviceIDToDrive('\\.\PHYSICALDRIVE2'));
finally
CoUninitialize;
end;
except
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Readln;
end.
关于delphi - 如何获取USB设备的盘符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653205/
我正在尝试创建备份批处理文件以自动执行 Acronis True Image 和备份维护。 USB 驱动器盘符会根据我正在备份的机器和/或连接的设备数量和使用的驱动器盘符而变化... 我的批处理位于
我在 http://network-blog.lan-secure.com/2008/03/usb-detection-using-wmi-script.html 上找到了这个脚本 strCompu
我正在使用以下代码获取计算机上每个驱动器的盘符列表。我想从此列表中获取 CD 驱动器的盘符。如何检查? 我用来获取列表的代码如下: 在 Form.Load 事件中: cmbDrives.Dro
这个问题之前有人问过,有一个答案据说有效 here 。但我试过了,它对我不起作用。 问题是 Win32_DiskDrive 上的查询返回的 PNPDeviceID 与“设备”类返回的不同。例如,在我的
这个问题之前有人问过,有一个答案据说有效 here 。但我试过了,它对我不起作用。 问题是 Win32_DiskDrive 上的查询返回的 PNPDeviceID 与“设备”类返回的不同。例如,在我的
所以我想我会在这里包含最终答案,这样您就不必理解这篇文章了。非常感谢 Simon Mourier 花时间解决这个问题。 我的工作代码 try {
我是一名优秀的程序员,十分优秀!