C#和diskpart:如何通过磁盘标签而不是数字来选择?

时间:2017-10-26 11:57:07

标签: c# format disk-partitioning

我有一个安装Windows映像的C#应用​​程序。我必须在用户界面上选择系统将复制的磁盘(C:或D:或...)。为此,没关系。

然后我必须格式化磁盘。我必须使用diskpart.exe选择与C:相关联的良好物理磁盘。但是使用diskpart,我们选择带有数字的磁盘:选择磁盘0或1或......

如何在好的磁盘号和用户在界面上选择的字母之间建立连接?

我在谷歌上找不到任何东西。我尝试使用wmi Win32_DiskDrive查找信息,但与diskpart detail disk没有任何共同之处。

谢谢

2 个答案:

答案 0 :(得分:1)

另一种解决方案而不是使用ManagementObjectSearcher是以编程方式使用DiskPart.exe,但我的代码是一个静态解决方案(使用正则表达式会更好)但会工作很长时间。

它需要具有更高执行权限的清单文件(添加新元素&gt;应用程序清单文件并将requestedExecutionLevel更改为<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />。以获取更多信息:https://stackoverflow.com/a/43941461/5830773

然后,您可以使用以下代码获取包含DiskPart.exe的驱动器列表:

// execute DiskPart programatically
Process process = new Process();
process.StartInfo.FileName = "diskpart.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.StandardInput.WriteLine("list volume");
process.StandardInput.WriteLine("exit");
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();

// extract information from output
string table = output.Split(new string[] { "DISKPART>" }, StringSplitOptions.None)[1];
var rows = table.Split(new string[] { "\n" }, StringSplitOptions.None);
for (int i = 3; i < rows.Length; i++)
{
    if (rows[i].Contains("Volume"))
    {
        int index = Int32.Parse(rows[i].Split(new string[] { " " }, StringSplitOptions.None)[3]);
        string label = rows[i].Split(new string[] { " " }, StringSplitOptions.None)[8];
        Console.WriteLine($@"Volume {index} {label}:\");
    }
}

这提供了来自DiskPart的以下输出,但您可以根据需要对其进行自定义:

Volume 0 C:\
Volume 1 D:\
Volume 2 F:\
Volume 3 G:\
Volume 4 I:\
Volume 5 H:\

现在用驱动器号搜索很明显:

public int GetIndexOfDrive(string drive)
{
    drive = drive.Replace(":", "").Replace(@"\", "");

    // execute DiskPart programatically
    Process process = new Process();
    process.StartInfo.FileName = "diskpart.exe";
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.Start();
    process.StandardInput.WriteLine("list volume");
    process.StandardInput.WriteLine("exit");
    string output = process.StandardOutput.ReadToEnd();
    process.WaitForExit();

    // extract information from output
    string table = output.Split(new string[] { "DISKPART>" }, StringSplitOptions.None)[1];
    var rows = table.Split(new string[] { "\n" }, StringSplitOptions.None);
    for (int i = 3; i < rows.Length; i++)
    {
        if (rows[i].Contains("Volume"))
        {
            int index = Int32.Parse(rows[i].Split(new string[] { " " }, StringSplitOptions.None)[3]);
            string label = rows[i].Split(new string[] { " " }, StringSplitOptions.None)[8];

            if (label.Equals(drive))
            {
                return index;
            }
        }
    }

    return -1;
}

用法:

Console.WriteLine(GetIndexOfDrive(@"D:\")); // returns 1 on my computer

答案 1 :(得分:0)

要在磁盘和逻辑驱动器(C:,D:等)之间进行映射,您必须从以下位置获取信息:

Win32_LogicalDisk
Win32_LogicalDiskToPartition
Win32_DiskPartition

以任何顺序。这些表格将包含所有信息。它可以在c#中使用System.Management轻松使用。