c# - 使用关联器从 MSFT_Disk 获取 MSFT_Partition
问题描述
我正在尝试MSFT_Partitions
从MSFT_Disk
对象中获取列表并遍历它们。这是我到目前为止一直在使用的代码,但它总是输出System.Management.ManagementException: 'Invalid query '
异常。
这是我目前正在使用的代码:
public static void GetDiskInfo() {
var rawDiskInfos = new ManagementObjectSearcher("root\\Microsoft\\Windows\\Storage", "SELECT * FROM MSFT_Disk");
foreach(var rawDiskInfo in rawDiskInfos.Get()) {
Console.WriteLine(rawDiskInfo["FriendlyName"]);
GetPartitionInfo(rawDiskInfo["ObjectId"]);
}
}
public static void GetPartitionInfo(object objectId) {
ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\Microsoft\\Windows\\Storage");
var query = new ObjectQuery("ASSOCIATORS OF {MSFT_Disk.ObjectId=\"" + objectId + "\"} WHERE AssocClass = MSFT_DiskToPartition");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
foreach(var partiton in queryCollection) {
Console.WriteLine(partiton["Guid"]);
}
}
我已经尝试了很多我在网上找到的解决方案,所有这些解决方案都导致了同样的异常。
非常感谢您的帮助!
解决方案
您在 Internet 上找到的大多数查询都不会这样做,但在一般情况下,您必须使用反斜杠字符objectId
转义传递给 WQL 查询的原始字符串(在您的情况下包含特殊字符),方法如下:
public static string EscapeWql(string text)
{
if (text == null)
return null;
var sb = new StringBuilder(text.Length);
foreach (var c in text)
{
if (c == '\\' || c == '\'' || c == '"')
{
sb.Append('\\');
}
sb.Append(c);
}
return sb.ToString();
}
所以你的方法现在应该是这样的:
public static void GetPartitionInfo(object objectId)
{
var scope = new ManagementScope(@"root\Microsoft\Windows\Storage");
var query = new ObjectQuery("ASSOCIATORS OF {MSFT_Disk.ObjectId=\"" + EscapeWql((string)objectId) + "\"} WHERE AssocClass = MSFT_DiskToPartition");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
using (var queryCollection = searcher.Get())
{
foreach (var partition in queryCollection)
{
Console.WriteLine(partition["Guid"]);
}
}
}
}
PS:不要忘记在IDisposable
类上使用语句。
推荐阅读
- python - 如何在 tkinter 中删除目录并仅显示文件名?
- dns - https url 的 UnknownHostException
- node.js - MongoDB updateOne({$pull}) 匹配一个文档,但没有从数组中删除它
- react-admin - 如何根据记录属性确定字段组件的范围
- three.js - Three.js PMREMGenerator 有不正确的纹理过滤
- c# - 获取“类型'SpatialReference'是在未引用的程序集中定义的。” 仅当未选中优化代码时
- google-sheets - 将多行数据排序为一行
- r - 如何在没有情节的情况下生成图例
- locust - Locust 是否使用 IP 欺骗?
- netlogo - Ifelse 嵌套在 If 中导致预期的命令错误