- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个安装 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/
我需要使用 DISKPART 按标签在 WinPE 中选择一个磁盘。我找到了这个,但我认为它已经过时了: @Echo %dbg%Off :: :: Find External drive and se
我有以下代码,在 DskPrt1.txt assign letter= 的最后一行之前都可以正常工作。该文件按应有的方式写入。在下拉列表中,我选择一个驱动器盘符,将所选盘符发送到 FILE fp,将其
我在格式化笔式驱动器时需要读取 diskpart 的输出。这是我在后台运行的格式化代码。 QString exePath = "diskpart.exe"; QString arguments = "
我想使用 Diskpart 命令行实用程序对用户隐藏驱动器。 我使用删除字母命令,驱动器变为隐藏。 但是我想在用 C 编写的程序中使用该驱动器的数据。 我该怎么做或者有可能吗? 我只想对 USB 闪存
我想将 diskpart 命令的输出写到一个文件中,例如,像这样 LIST PARTITION >c:\output.txt 我该怎么做? 最佳答案 您可以使用 diskpart 的 /s 选项来执行
我试图通过用通过管道发出的命令替换它来消除用于自动化 diskpart 的临时脚本文件(即 diskpart/s scriptFile),但是我似乎无法弄清楚如何检测 diskpart 何时抛出错误.
在尝试删除所有分区时,我正在尝试开发一个批处理文件来运行和删除 Windows 7 中的隐藏分区。通常我会在命令提示符窗口中逐行执行此操作,但我试图弄清楚如何创建批处理文件来运行并加快此过程。 这是我
在 DISKPART.EXE ,当多个挂载点分配给一个卷时,我会得到信息。在图片中我们看到 Drive G: 也可以使用 D:\SQL\MSSQL13.MSSQLSERVER\DATA\或 D:\Bl
我正在尝试从 diskpart 命令输出中捕获卷号。目前我是这样做的: 使用批处理脚本: @echo off set VOLNO='' set DRIVE=C for /f "tokens=2,3"
我正在编写一个程序,它需要解析 Windows 命令“diskpart”的输出结果,特别是在用 VB.NET 解析磁盘和卷信息(使用“list disk”和“list volume”)时 我设法使用
因此,在深入研究现有脚本时,我注意到 Windows 列出分区和卷的方式有所不同。有人可以向我解释我所看到的吗?仅仅是diskpart和WMI的区别吗? linux 怎么看这些? C:\WINDOWS
我熟悉 VolumeSerialNumber,我需要与 diskpart 中所示相同的磁盘 ID: WD My Passport 0740 USB 设备磁盘 ID:08B29B51类型 : USB状态
磁盘部分“myScript.txt”: select disk 1 convert dynamic noerr select disk 2 convert dynamic noerr create v
我有一个安装 Windows 镜像的 C# 应用程序。我必须在用户界面上选择系统将复制到的磁盘(C: 或 D: 或...)。为此,没关系。 然后我必须格式化磁盘。我必须使用 diskpart.exe
我正在尝试编写一个批处理文件来删除分配给没有文件系统的分区的驱动器号。我无法使用 wmi,因为它正在 WinPE 恢复环境中使用。 DISKPART> list volume Volume ###
在我的 Azure 角色中,我想要安装 VHD - 大致相当于以下 diskpart 命令: vdisk select VhdFilePath vdisk attach This answer解释如何
我正在尝试创建批处理文件以打开/关闭驱动器的只读模式。 我创建了两个调用 diskpart 的批处理文件,以及两个包含要传递给 diskpart 的命令的文本文件。 当我单独运行 diskpart 命
我是一名优秀的程序员,十分优秀!