通过diskpart.exe删除所有驱动器号

时间:2018-04-11 12:04:56

标签: batch-file disk-partitioning winpe

由于我正在寻找一个程序化的答案,所以在SO上发布这个问题,尽管它可以在related and migrated问题上看到它的边界。

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

为此,我打算使用diskpart in scriptmode(建议else where),其中包含noerr选项和状态

  

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

     

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

multiple approaches只有loop所有可能的驱动器名称,并多次致电diskpart

然而,这引入了一些unpleasant overhead(以及每个之间需要等待15秒),同样如here所述

  

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

我的方法是完全忽略磁盘(因为selecting a volumeselects the appropriate disk)并循环遍历所有字母以生成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命令does not havenoerr切换,因此脚本执行将在第一个不存在的卷之后停止。因此,可能需要先找出所有现有的卷,然后才对它们进行操作。

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

1 个答案:

答案 0 :(得分: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
相关问题