-1

因为我正在寻找一个程序化的答案,所以我把这个问题贴在 SO 上,尽管它的边界正如人们可以在这个相关和迁移的问题上看到的那样。

我正在尝试自动删除启动到 Windows PE 的系统中的所有分配的磁盘号。这要求解决方案是批处理的(而不是Powershell)。

为此,我打算在脚本模式中使用diskpart (如其他地方所建议的那样),它具有noerr选项和状态

默认情况下,如果 DiskPart 在尝试执行脚本任务时遇到错误,DiskPart 将停止处理脚本并显示错误代码(除非您指定了 noerr 参数)。...

noerr 参数使您能够执行有用的任务,例如使用单个脚本删除所有磁盘上的所有分区,而不考虑磁盘总数。

多种 方法可以遍历所有可能的驱动器名称并diskpart多次调用。

然而,这会带来一些令人不快的开销(以及每次之间必须等待 15 秒),正如这里所说

您可以运行连续的 DiskPart 脚本,但在连续脚本中再次运行 DiskPart 命令之前,必须在每个脚本之间留出至少 15 秒的时间才能完全关闭先前的执行

我的方法是完全忽略磁盘(因为选择一个卷也会选择适当的磁盘)并遍历所有字母以生成diskpartscript.txt类似的

for %%l in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    echo select volume %%l >> diskpartscript.txt
    echo remove all noerr >> diskpartscript.txt
)

:: call diskpart.exe once with generated script file
diskpart.exe /s diskpartscript.txt

不幸的是,该命令select volume没有开关noerr,因此脚本执行将在第一个不存在的卷之后停止。所以可能需要先找出所有现有的卷,然后只对它们进行操作。

所以我现在的问题是,如何通过一次diskpart.exe调用删除所有可能存在的磁盘上的所有可能存在的驱动器号。

4

1 回答 1

2

作为一个想法,为什么不只为已安装的卷生成驱动器号,减去分配给 PE 磁盘的驱动器号(当前驱动器)?这意味着您只使用现有卷。

例子:

@Echo Off
SetLocal EnableDelayedExpansion
Set "Ltrs="
For /F "Delims=: " %%A In ('MountVol^|Find ":\"'
) Do If /I Not "%%A"=="%CD:~,1%" Set "Ltrs=%%A !Ltrs!"
If Not Defined Ltrs Exit /B
Rem Test
For %%A In (%Ltrs%) Do Echo Select Volume %%A
Pause
于 2018-04-11T15:58:09.077 回答