将ManagementObject查询保存为double

时间:2017-07-18 19:57:27

标签: c# wmi

我目前正在制作一个程序来监控网络上服务器的正常运行时间和大小。我在显示服务器的大小和剩下的空间时遇到了一些问题。

我的代码是

public void setSpace(string ip)
{
    ManagementScope scope = new ManagementScope("\\\\" + ip + "\\root\\cimv2");
    scope.Connect();

    ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
    SelectQuery query1 = new SelectQuery("Select * from Win32_LogicalDisk");

    ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

    ManagementObjectCollection queryCollection = searcher.Get();

    ManagementObjectSearcher searcher1 = new ManagementObjectSearcher(scope, query1);
    ManagementObjectCollection queryCollection1 = searcher1.Get();

    foreach (ManagementObject m in queryCollection)
    {
        // Display the remote computer information
        Console.WriteLine("Computer Name : {0}",
            m["csname"]);
        Console.WriteLine("Windows Directory : {0}",
            m["WindowsDirectory"]);
        Console.WriteLine("Operating System: {0}",
            m["Caption"]);
        Console.WriteLine("Version: {0}", m["Version"]);
        Console.WriteLine("Manufacturer : {0}", m["Manufacturer"]);
        Console.WriteLine();

    }

    foreach (ManagementObject mo in queryCollection1)
    {
        Console.WriteLine("  Disk Name : {0}", mo["Name"]);
        Console.WriteLine("   Disk Size : {0}", mo["Size"]);
        Console.WriteLine("  FreeSpace : {0}", mo["FreeSpace"]);
        Console.WriteLine("  Disk DeviceID : {0}", mo["DeviceID"]);
        Console.WriteLine("  Disk VolumeName : {0}", mo["VolumeName"]);
        Console.WriteLine("  Disk SystemName : {0}", mo["SystemName"]);
        Console.WriteLine("Disk VolumeSerialNumber : {0}", mo["VolumeSerialNumber"]);
        Console.WriteLine();

        freeSpace = freeSpace + (double)mo["FreeSpace"];
        totalSpace = totalSpace + (double)mo["Size"];

    }
    Console.ReadLine();
}

我正在尝试使用FreeSpace和Size数字并将它们放在一个双变量中。

freeSpace = freeSpace + (double)mo["FreeSpace"];
totalSpace = totalSpace + (double)mo["Size"];

当我尝试运行程序时,我得到一个例外。

  

'对象引用未设置为对象的实例。'

2 个答案:

答案 0 :(得分:1)

你有一个NullReferenceException,因为代码没有返回指定的成员(例如FreeSpace)。我在我的PC上尝试了代码,我有2个分区和1个DVD驱动器。当它在迭代queryCollection1对象时到达DVD驱动器(空磁盘)时引发异常。因此,您必须检查所需的mo对象的成员是否为空引用。

if (mo["FreeSpace"] != null)
    freeSpace = freeSpace + (ulong)mo["FreeSpace"];

if (mo["Size"] != null)
    totalSpace = totalSpace + (ulong)mo["Size"];

我也将转换更改为ulong,因为FreeSpace和Size是ulong类型。并且存在从ulong到double的隐式转换。您不需要更改freeSpace和totalSpace的变量类型。

答案 1 :(得分:-1)

你的演员阵容错了。你应该施放到ulong而不是施放到双倍。变量freeSpace和totalSpace应该是相同的类型,并在第一次使用之前进行初始化。

freeSpace = freeSpace + (ulong)mo["FreeSpace"];
totalSpace = totalSpace + (ulong)mo["Size"];