【问题标题】:WMI query returns nothingWMI 查询不返回任何内容
【发布时间】:2013-04-05 21:31:31
【问题描述】:

我正在使用 WMI 进行查询以检查特定的驱动器号,如果它不存在,那么我想运行一个方法来使用特定设置创建它。现在我面临的问题是当我发送测试查询以查看驱动器号是否存在时,它返回空。没有错误或异常。

我将如何处理这种情况?

谢谢

ManagementObjectSearcher searcher =
                      new ManagementObjectSearcher("root\\cimv2",
                      @"SELECT * FROM Win32_Volume Where DriveLetter = '" + DriveLetter + "'");
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    drives.CurrentDriveLetter = queryObj["DriveLetter"] == null ? "null" : queryObj["DriveLetter"].ToString();
                    drives.CurrentDriveSize = queryObj["Capacity"] == null ? "null" : queryObj["Capacity"].ToString();
                    drives.CurrentDriveName = queryObj["Label"] == null ? "null" : queryObj["Label"].ToString();


                }

【问题讨论】:

  • UpdateUI(drives) can you post that method as well..? also what is drives 是什么,它在哪里声明?`
  • drives 是一个类,只包含数字/字母/标签/大小。 UpdateUI 是更新列表视图的内容。这两件事可以忽略不计,我想弄清楚的是一种区分有数据的结果和没有数据的结果的方法。这对我来说是棘手的部分,因为没有抛出异常
  • 我测试了代码,我得到了除了驱动器号之外的所有内容,你的 .ToString() 应该以这种方式投射 (string)queryObj["DriveLetter"];
  • 您可以查看此链接并轻松转换为 C# 代码以及msdn.microsoft.com/en-us/library/windows/desktop/…
  • 但如果该驱动器不存在怎么办?尝试传入一个随机驱动器号,它不会出错,所以你不知道查询是否有效

标签: c# wmi wmi-query


【解决方案1】:

在您的 cmets 之后,您只需要确定 ManagementObjectSearcher.Get 方法返回的集合是否包含元素。为此,您可以使用 Count 属性。

试试这个示例代码

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {


        static void Main(string[] args)
        {
            try
            {
                ManagementScope Scope;                
                Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", "."), null);
                Scope.Connect();
                ObjectQuery Query = new ObjectQuery("SELECT * FROM Win32_Volume Where DriveLetter='X:' ");
                ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
                if (Searcher.Get().Count==0)                
                {
                    Console.WriteLine("Do something, when the collection is empty.");                
                }
                else
                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    Console.WriteLine("{0} {1}","Name",WmiObject["Name"]);// String

                }
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2021-04-24
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多