从驱动器号码获取卷标(不是驱动器号)

问题描述 投票:0回答:2

我可以从这样的驱动器字母中获取卷标(我想要的)..

 try
        {
            DriveInfo[] myDrives = DriveInfo.GetDrives();

        foreach (DriveInfo drive in myDrives)
        {
            Console.WriteLine("Drive:" + drive.Name);
            Console.WriteLine("Drive Type:" + drive.DriveType);

            if (drive.IsReady == true)
            {
                Console.WriteLine("Vol Label:" + drive.VolumeLabel);

            }
        }
    }
    catch (Exception)
    {

        throw;
    }

但我想要一个驱动器号码的卷标。我可以用这个获得驱动器号码......

 foreach (var drive in new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>().ToList())
            {

                var driveNumber = Regex.Match((string)drive["Antecedent"], @"Disk #(\d*),").Groups[1].Value;

                Console.WriteLine("Drive Number: " + driveNumber);
                Console.WriteLine(Environment.NewLine);
            }

如何将一些东西放在一起以获取所有给定驱动器号的卷标(从显示的第二个代码块)?

更多信息:我无法使用“LogicalDisk ...”进行查询,因为我发现安装的vhds似乎不被视为“logicalDisks”

enter image description here

c# powershell wmi
2个回答
0
投票

跟进你对Win32_LogicalDiskToPartition的搜索,搜索Win32_LogicalDisk过滤由确定的driveLetter拉回VolumeName属性。

            var drives = new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>();
            var disks = new ManagementObjectSearcher("Select * from Win32_LogicalDisk").Get().Cast<ManagementObject>();
            foreach (var drive in drives)
            {
                var driveLetter = Regex.Match((string)drive["Dependent"], @"DeviceID=""(.*)""").Groups[1].Value;
                var driveNumber = Regex.Match((string)drive["Antecedent"], @"Disk #(\d*),").Groups[1].Value;

                Console.WriteLine("Drive Letter: " + driveLetter);
                Console.WriteLine("Drive Number: " + driveNumber);

                // TODO: Enhance this to properly handle when the LINQ returns nothing.
                //       Likely only an edge case, but BSTS.
                var foundDisk = disks.Where((d) => d["Name"].ToString() == driveLetter).FirstOrDefault();

                // In the event that Drive Letter is not available, try the disk path
                if (foundDisk == null) {
                  foundDisk = disks.Where((d) => d.Path.ToString() == drive["Dependent"].ToString()).FirstOrDefault();
                }

                if (foundDisk == null) {
                  Console.WriteLine("Drive Label: <Unknown>");
                } else {
                  Console.WriteLine("Drive Label: " + foundDisk["VolumeName"]);
                }

                Console.WriteLine(Environment.NewLine);
            }


0
投票

您所谓的“驱动器号”在WMI用语中被命名为“磁盘索引”。您不必解析任何东西来建立WMI类之间的关系。

你只能从Win32_LogicalDiskVolumeName财产获得一个卷标。它也适用于已安装的VHD(X)。以下代码浏览所有分区(注意磁盘可以有多个分区)并转储关联的逻辑磁盘(注意分区可以有多个逻辑磁盘)卷名,如果有的话:

foreach (var partition in new ManagementObjectSearcher("SELECT * FROM Win32_DiskPartition").Get())
{
    Console.WriteLine("Caption : " + partition["Caption"]);
    Console.WriteLine("Disk Index : " + partition["DiskIndex"]);

    // associate the partition with logical disk(s)
    foreach (var logicalDisk in new ManagementObjectSearcher(
        "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
        partition["DeviceID"] +
        "'} WHERE AssocClass=Win32_LogicalDiskToPartition").Get())
    {
        Console.WriteLine(" " + logicalDisk["VolumeName"]);
    }
}

如果您想要给定磁盘的分区和卷名,只需限制初始查询,例如:SELECT * FROM Win32_DiskPartition WHERE DiskIndex=1

© www.soinside.com 2019 - 2024. All rights reserved.