在下面的方法中,我启动一个调用WMIC.exe的过程,以便查询连接的usb设备的DeviceID。 问题在于,有时虽然设备已插入,但WIMC不会返回任何实例,就像设备未插入一样。然而,同时设备管理器在“端口(COM& LPT)”下显示设备,这意味着WMIC的信息不准确。我的意思是,如果设备崩溃或以任何方式出现设备故障并且需要某种重置,它也应该不在设备管理器列表中。
方法:
private string DonglePortName()
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "C:\\Windows\\System32\\wbem\\WMIC.exe";
startInfo.Arguments = "PATH Win32_SerialPort GET /VALUE";
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
processTemp.Start();
string output = processTemp.StandardOutput.ReadToEnd();
int indexOfBGEntry = output.IndexOf("Bluegiga Bluetooth Low Energy");
if(indexOfBGEntry > -1)
{
string output_sub = output.Substring(indexOfBGEntry);
string str = "DeviceID=";
int i = output_sub.IndexOf(str);
int start = i + str.Length;
string substr = output_sub.Substring(start);
int end = substr.IndexOf("\r");
return output_sub.Substring(start, end);
}
return null;
}
此时在cmd窗口上执行:
C:\\Windows\\System32\\wbem\\WMIC.exe PATH Win32_SerialPort GET /VALUE
返回:
No Instance(s) Available.
同时设备管理器显示设备(即使在单击扫描硬件更改后)。
所以上面的C#代码实际上并不需要用来演示这个问题,但我只是在这里,以防万一有人可以提出另一个更强大的方法来获取设备端口(在C#中)或者可以指出原因WMIC的不准确性。
另一个线索是,在读取/写入SerialPort的代码的另一部分上,WMIC总是在异常(和崩溃)之后返回No Instance(s) Available
。然后,我必须拔掉并重新插入USB设备,然后WMIC再次“查看”它。尽管如此,设备管理器始终显示设备。
答案 0 :(得分:0)
您正在查找错误的WMIC
路径,因为Win32_SerialPort
WMI
类表示运行Windows的计算机系统上的串行端口。简而言之,这里是ProviderType
属性(通信提供者类型)列表:
传真设备,LAT协议,调制解调器设备,网桥,并行 端口,RS232串口,RS422端口,RS423端口,RS449端口, 扫描仪设备,TCP / IP TelNet,X.25,未指定
检查下一个命令输出:
wmic path CIM_LogicalDevice where "Description like 'USB%'" get /value