gpt4 book ai didi

C# 和 diskpart : how to select by disk label and not by a number?

转载 作者:太空宇宙 更新时间:2023-11-03 12:21:31 25 4
gpt4 key购买 nike

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

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

如何将好盘号与用户在界面上选择的盘符联系起来?

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

谢谢

最佳答案

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

它需要一个具有更高执行权限的 list 文件(添加新元素>应用程序 list 文件并将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

关于C# 和 diskpart : how to select by disk label and not by a number?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46953723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com