Board logo

标题: [系统相关] [已解决]如何在批处理中使用diskpart命令,删除特定卷标的分区 [打印本页]

作者: 5i365    时间: 2021-8-7 05:23     标题: [已解决]如何在批处理中使用diskpart命令,删除特定卷标的分区

本帖最后由 5i365 于 2021-8-8 17:14 编辑

本人平时删除分区时, 很少使用其它的第三方软件, 都是在PE的磁盘管理下, 使用右键删除分区,  但最近, 非常想尝试一下使用批处理代码来自动删除分区, 看看效果如何,  如果能实现, 以后删分区的操作相对而言就更简单了,改成特定卷标就行了,例如,将要删除分区的卷标改为no,批处理执行后相关的分区就删除了

因为要在PE下使用, 而PE下不能执行wmic命令, 所以只能使用diskpart命令, 具体描述如下:

---先判断WIN分区在哪个硬盘,得到硬盘号!因为是在PE下,Win系统的盘符有可能不为C,所以不能通过盘符做判断, 可以根据分区下是否有windows\system32文件夹判断 【只处理包含window系统的硬盘, 其它的硬盘即使有卷标为no的分区, 也不做处理 】
---删除卷标为no的分区,可能有一个或多个, 而卷标不为no的分区则保留
【根据卷标得出盘符,
然后sel volume=盘符如C 没有冒号:
最后del volume noerr】


---如果该硬盘中有ESP系统引导分区, 即使卷标不是no, 也删除它 【最下面输出信息中 type 为 system 的分区 是esp分区】
---如果该硬盘中有MSR保留分区, 即使卷标不是no, 也删除它 【最下面输出信息中 type 为 Reserved 的分区 是MSR保留分区】
---如果该硬盘中有恢复分区, 即使卷标不是no, 也删除它, 【最下面输出信息中 type 为 Recovery 的分区 是恢复分区】

如果没找到卷标为no的分区, 则弹出下面消息框, 点确定后, 脚本直接退出
start mshta vbscript:msgbox("No partition no was found",0,"tip")(window.close)&&exit

上面几种情况的判断, 应该要根据分区的类型来添加限定条件, 相关代码参考链接:
http://www.bathome.net/redirect. ... 9390&pid=242338

感谢几位大侠所推荐的无忧论坛的专门针对diskpart而写的脚本工具,虽然也可以实现效果,  但是操作步骤感觉不太简单明了, 代码量也非常多, 想自行修改下, 但能力有限, 实在吃不消
另外,还有不少磁盘软件, 如diskgnius, 傲梅助手等, 都可以实现我要的效果, 但是不在此贴的讨论范围, 感觉还是系统内置的工具来的直接
  
期待诸位高手, 尽量能用最少的代码, 实现上面功能, 那将非常震撼, 提前感谢!

下面是完整的手动删除分区操作步骤:
提醒:
为了让代码中英文系统兼容性更好,最好在批处理代码最前面加上chcp 437  切换到英文,这样会输出英文信息,就像最下面的输出信息那样
________________________________________________________________________________
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\Administrator>chcp 437

Active code page: 437

X:\Users\Administrator>diskpart

Microsoft DiskPart version 10.0.19041.1

Copyright (C) Microsoft Corporation.
On computer: Winpe

DISKPART> sel disk 1

Disk 1 is now the selected disk.

DISKPART> detail disk

TOSHIBA MK1655GSX USB Device
Disk ID: {AA01743D-F6E3-11EB-8FB7-08107649E626}
Type   : USB
Status : Online
Path   : 0
Target : 0
LUN ID : 0
Location Path : UNAVAILABLE
Current Read-only State : No
Read-only  : No
Boot Disk  : No
Pagefile Disk  : No
Hibernation File Disk  : No
Crashdump Disk  : No
Clustered Disk  : No

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 3     F   no          NTFS   Partition     39 GB  Healthy   
  Volume 4     G   soft         NTFS   Partition     20 GB  Healthy
  Volume 5     H   data         NTFS   Partition     60 GB  Healthy
  Volume 6     I                RAW    Partition     10 GB  Healthy
  Volume 7                      NTFS   Partition     19 GB  Healthy    Hidden
  Volume 8                      FAT32  Partition    300 MB  Healthy    Hidden

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             300 MB  1024 KB
  Partition 2    Reserved            16 MB   301 MB
  Partition 3    Primary             39 GB   317 MB
  Partition 4    Primary             20 GB    39 GB
  Partition 5    Primary             60 GB    59 GB
  Partition 6    Recovery            10 GB   119 GB
  Partition 7    Primary             19 GB   129 GB

DISKPART> sel part 1

Partition 1 is now the selected partition.

DISKPART> del part override

DiskPart successfully deleted the selected partition.

DISKPART> sel part 2

Partition 2 is now the selected partition.

DISKPART> del part override

DiskPart successfully deleted the selected partition.

DISKPART> sel part 3

Partition 3 is now the selected partition.

DISKPART> del part override

DiskPart successfully deleted the selected partition.

DISKPART> sel part 6

Partition 6 is now the selected partition.

DISKPART> del part override

DiskPart successfully deleted the selected partition.




作者: idwma    时间: 2021-8-7 16:27

本帖最后由 idwma 于 2021-8-7 18:13 编辑

不清楚pe里bat是默认管理员权限运行的吗
弹框外面不能套括号改了一下
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 437
  3. for /f "delims=" %%i in ('^(echo list disk ^)^|diskpart^|find "Online"') do set/a n+=1
  4. set/a n=!n!-1
  5. for /l %%i in (0,1,!n!) do ((echo select disk %%i &echo detail disk)|diskpart|findstr /i "volume.*no" &&set f=%%i)
  6. if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit
  7. for /l %%i in (0,1,!n!) do (
  8. for /f "tokens=2,3 delims= " %%a in ('^(echo select disk %%i ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
  9. if exist %%b:\window\system32 (
  10. (echo select disk %%i
  11. echo select volume %%a
  12. echo delete volume)|diskpart
  13. for /f "tokens=2 delims= " %%c in ('^(echo select disk %%i ^&echo list part^)^|diskpart^|findstr "system Reserved Recovery"') do (
  14. if not "%%c"=="" (
  15. (echo sel disk %%i
  16. echo sel part %%c
  17. echo del part override)|diskpart)
  18. )
  19. )
  20. )
  21. )
  22. pause
复制代码

作者: 5i365    时间: 2021-8-7 17:56

本帖最后由 5i365 于 2021-8-7 18:06 编辑

回复 2# idwma


    感谢大侠帮忙, 刚才试了一下, 闪一下, 有卷标为no的分区的一些信息出现,然后就关闭了, 我录了采集卡视频演示
https://ws28.cn/f/63ckg3ud0io

另外, 当没有卷标为no的分区时, 也没有消息框提示, 闪一下, 没有任何信息出现,就关了
作者: 5i365    时间: 2021-8-7 18:42

本帖最后由 5i365 于 2021-8-7 20:04 编辑

回复 2# idwma

PE下默认就是管理员权限, 不用提权

又试了一下,
1.当没有卷标为no的分区时, 有消息框提示, 但没有在最上层
2.当有卷标为no的分区时,会有下面的消息提示, 但是没有删除任何分区

Active code page: 437
  Volume 0     D   no           NTFS   Partition     40 GB  Healthy
Press any key to continue . . .
作者: 5i365    时间: 2021-8-7 18:51

本帖最后由 5i365 于 2021-8-7 20:17 编辑

回复 2# idwma

删除分区,有两种方式,
1. 通过vol   我认为用这种方式删Win系统所在分区最合适,因为详情中,对于win分区,找不到类型,只显示primary, 好多分区也是这个类型, 一删就全删了
list volume
sel volume=分区盘符如C 前面要有=号,C后面没有冒号:
del volume noerr

2.通过part   我认为用这种方式,删那三种类型的分区最合适, 因为每种分区都有类型
list part
sle part 分区的序号
del part override
作者: 5i365    时间: 2021-8-7 19:58

回复 2# idwma


    将第11 12行代码改成如下, 仍然没有任何反应

                        echo select volume=%%a
                        echo delete volume noerr)|diskpart
作者: idwma    时间: 2021-8-7 22:00

那再换一个方式
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 437
  3. echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
  4. if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit
  5. for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  6. if exist %%b:\window\system32 (
  7. (echo select volume %%a
  8. echo delete volume)|diskpart
  9. for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list part^)^|diskpart^|findstr "system Reserved Recovery"') do (
  10. (echo select volume %%a
  11. echo sel part %%c
  12. echo del part override)|diskpart
  13. )
  14. )
  15. )
  16. pause
复制代码

作者: 5i365    时间: 2021-8-7 22:06

你好,第七,八行,好像错了, 应该是
                        echo select volume=%%a
                        echo delete volume noerr)|diskpart

我马上测试一下
作者: idwma    时间: 2021-8-7 22:09

回复 8# 5i365

一样的吧我试了一下这样也可以删
作者: 5i365    时间: 2021-8-7 22:11

回复 7# idwma

和前面的代码效果一样, 我改了也不行
作者: 5i365    时间: 2021-8-7 22:12

本帖最后由 5i365 于 2021-8-7 22:13 编辑

回复 9# idwma

sel
    https://docs.microsoft.com/zh-cn ... mands/select-volume

del
    https://docs.microsoft.com/zh-cn ... mands/delete-volume
作者: idwma    时间: 2021-8-7 22:58

尴尬呀复制你给的信息,有没发现这行少了什么if exist %%b:\windows\system32 (
作者: 5i365    时间: 2021-8-7 23:56

本帖最后由 5i365 于 2021-8-8 00:04 编辑

回复 12# idwma
你好,真是不好意思,我的错,现在改正后,可以执行删除命令了,但是有的分区没有删除

例如,原来的硬盘分区是这样的
1.最前面有个Esp分区
2.C盘是Windows分区,我把它的卷标改为no了
3.D盘我也把卷标改为no了,
4.是MSR保留分区
5.是recovery恢复分区
6.是卷标为data的分区

命令执行后的情况
1.esp分区----没有删除
2.C盘的windows分区删除了
3.D盘卷标为no的分区----没有删除
4.MSR分区删除了
5.recovery分区删除了
____________________________________________________
esp分区没有删除的原因,感觉应该是 下面代码中 system 没识别或被跳过了, esp分区,就显示system类型
findstr "system Reserved Recovery"

另一个卷标为no的分区没有删除的原因,应该是两个或多个卷标名为no的分区, 其代码没有处理或生效
____________________________________________________

代码执行后,用diskpart命令查看分区情况如下:

DISKPART> detail disk

Hitachi HDP725025GLA380
Disk ID: {33E8B399-451F-43F3-BB00-A1116C0B80AE}
Type   : SATA
Status : Online
Path   : 0
Target : 0
LUN ID : 0
Location Path : PCIROOT(0)#PCI(1F02)#ATA(C00T00L00)
Current Read-only State : No
Read-only  : No
Boot Disk  : No
Pagefile Disk  : No
Hibernation File Disk  : No
Crashdump Disk  : No
Clustered Disk  : No

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     D   no           NTFS   Partition     20 GB  Healthy
  Volume 1     E   DATA         NTFS   Partition     78 GB  Healthy
  Volume 2         EFI          FAT32  Partition   1027 MB  Healthy    Hidden

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System            1027 MB  1024 KB
  Partition 3    Primary             20 GB    31 GB
  Partition 5    Primary             78 GB   102 GB

DISKPART>
作者: Batcher    时间: 2021-8-8 00:06

回复 13# 5i365


    是不是字母大小写的原因,用 findstr /i 试试
作者: 5i365    时间: 2021-8-8 00:16

本帖最后由 5i365 于 2021-8-8 00:23 编辑

回复 14# Batcher

非常感谢指点, 现在用下面的代码, 只有一个问题了, 就是只删除了1个卷标为no的分区, 另一个卷标为no的分区没有删除
删除卷标为no的分区,可能有一个或多个,有什么更好的方法删除它们吗?

@echo off&setlocal enabledelayedexpansion
chcp 437
for /f "delims=" %%i in ('^(echo list disk ^)^|diskpart^|find "Online"') do set/a n+=1
set/a n=!n!-1
for /l %%i in (0,1,!n!) do ((echo select disk %%i &echo detail disk)|diskpart|findstr /i "volume.*no" &&set f=%%i)
if not defined f start mshta vbscript:msgbox("not find no",0,"tip")(window.close)&&exit
for /l %%i in (0,1,!n!) do (
        for /f "tokens=2,3 delims= " %%a in ('^(echo select disk %%i ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
                if exist %%b:\windows\system32 (
                        (echo select disk %%i
                        echo select volume %%a
                        echo delete volume)|diskpart
                        for /f "tokens=2 delims= " %%c in ('^(echo select disk %%i ^&echo list part^)^|diskpart^|findstr /i "system Reserved Recovery"') do (
                                if not "%%c"=="" (
                                (echo sel disk %%i
                                echo sel part %%c
                                echo del part override)|diskpart)
                        )
                )
        )
)
pause
作者: 5i365    时间: 2021-8-8 05:55

本帖最后由 5i365 于 2021-8-8 07:49 编辑

回复 12# idwma


用下面的第二种方法的代码,也能实现和第一种方法代码相同的效果, 代码少了点,  但是和第一方法相比, 没有了 【只处理Win系统分区所在的硬盘】的代码, 把所有硬盘上的分区都处理了 看来还是得在第一种方法的代码上改

另外,第二种方法中,将第二行[setlocal enabledelayedexpansion]注释掉也能成功执行,

目前的问题 就一个了, 不能删除多个卷标为no的分区, 只能删第一个
——————————————————————————————————————————————————————————————
方法二代码:
@echo off
::setlocal enabledelayedexpansion
chcp 437
echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
if not defined f start mshta vbscript:msgbox("not find no vol",0,"tip")(window.close)&&exit
        for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
                if exist %%b:\windows\system32 (
                        (echo select volume %%a
                        echo delete volume)|diskpart
                        for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list part^)^|diskpart^|findstr /i "system Reserved Recovery"') do (
                                (echo select volume %%a
                                echo sel part %%c
                                echo del part override)|diskpart
                        )
                )
        )
pause

——————————————————————————————————————————————————————————————
方法一代码:
@echo off&setlocal enabledelayedexpansion
chcp 437
for /f "delims=" %%i in ('^(echo list disk ^)^|diskpart^|find "Online"') do set/a n+=1
        set/a n=!n!-1
        for /l %%i in (0,1,!n!) do ((echo select disk %%i &echo detail disk)|diskpart|findstr /i "volume.*no" &&set f=%%i)
                if not defined f start mshta vbscript:msgbox("not find no",0,"tip")(window.close)&&exit
                for /l %%i in (0,1,!n!) do (
                        for /f "tokens=2,3 delims= " %%a in ('^(echo select disk %%i ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
                                if exist %%b:\windows\system32 (
                                        (echo select disk %%i
                                        echo select volume %%a
                                        echo delete volume)|diskpart
                                        for /f "tokens=2 delims= " %%c in ('^(echo select disk %%i ^&echo list part^)^|diskpart^|findstr /i "system Reserved Recovery"') do (
                                                if not "%%c"=="" (
                                                (echo sel disk %%i
                                                echo sel part %%c
                                                echo del part override)|diskpart)
                                        )
                                )
                        )
                )
pause
作者: 5i365    时间: 2021-8-8 06:26

本帖最后由 5i365 于 2021-8-8 08:01 编辑

回复 12# idwma


    我尝试用下面的代码, 只删除卷标为no的分区, 但是还不能全删除,总是会留下几个,  甚至有时会把卷标为data的分区或其它卷标的分区也删除了, 不稳定, 太可怕了, 多亏是在没有数据的硬盘下测试的   为什么会删除卷标不是no的分区呢?

@echo off
chcp 437
echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
if not defined f start mshta vbscript:msgbox("not find no",0,"tip")(window.close)&&exit
        for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
                        (echo select volume %%a
                        echo delete volume)|diskpart
                )
        )
pause
作者: newswan    时间: 2021-8-8 09:58

本帖最后由 newswan 于 2021-8-8 09:59 编辑

回复 17# 5i365
  1.         for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  2.                         (echo select volume %%a
  3.                         echo delete volume)|diskpart
复制代码
使用的卷号,而不是盘符
删除一个卷,如果是前面的,后面的卷,卷号自动上移,第一个删除后,下面的全乱了
所以会删错,删不完
把 %%a 改成 %%b
作者: Batcher    时间: 2021-8-8 10:00

回复 17# 5i365


排查的整体思路是:看看到底是哪个环节出现了问题

第一步,先看看完整的列表:
  1. echo list vol|diskpart
复制代码
第二步:再看看findstr是否过滤出了正确的信息
  1. echo list vol|diskpart|findstr /i "volume.*no"
复制代码
第三步:最后看看for循环是否获取到了正确的信息:
  1. chcp 437
  2. for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  3.     echo select volume %%a
  4. )
复制代码

作者: 5i365    时间: 2021-8-8 10:50

本帖最后由 5i365 于 2021-8-8 10:59 编辑

回复 18# newswan

感谢指点,
刚刚试了一下, 还是没有删完, 我建了4个卷标为no的分区, 执行后,还是会会留下一个,

我再次执行, 余下的no的分区没有了, 但是把data分区也给干掉了,

执行情况太不稳定了, 有时一个删不掉, 再执行,删掉1个, 再执行,把data分区给删了, 最后执行,把余下的删了

哪里出了问题呢?
作者: 5i365    时间: 2021-8-8 10:51

回复 19# Batcher

多谢指导, 很想知道大侠, 用什么批处理的IDE调试, 另外很想知道有没有将批处理格式化的工具?
作者: 5i365    时间: 2021-8-8 12:05

本帖最后由 5i365 于 2021-8-8 12:12 编辑

回复 18# newswan

echo list vol|diskpart|findstr /i "volume.*no"
如何修改上面的代码,来搜索到盘符?
然后用
sel vol 盘符
del vol
应该稳定,不会变化

找到一段代码, 但是不知道怎么修改
(echo select disk 0 ^& echo detail disk ^) ^| diskpart ^| findstr /i "%labs:|= %"'
作者: newswan    时间: 2021-8-8 12:34

回复 22# 5i365


你现在用的方法1还是方法2?
作者: newswan    时间: 2021-8-8 12:43

本帖最后由 newswan 于 2021-8-8 12:48 编辑

回复 22# 5i365

改的这一段,%%a 是 卷number %%b 是卷letter,
当然,要有letter 才是正确的,否则就要出错。
  1. @echo off
  2. chcp 437
  3. echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
  4. if not defined f start mshta vbscript:msgbox("not find no",0,"tip")(window.close)&&exit
  5.         for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  6.                         (echo select volume %%b
  7.                         echo delete volume)|diskpart
  8.                 )
  9.         )
  10. pause
复制代码

作者: newswan    时间: 2021-8-8 12:50

  1.   Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  2.   ----------  ---  -----------  -----  ----------  -------  ---------  --------
  3.   Volume 0     C                NTFS   Partition    120 GB  Healthy    Boot
  4.   Volume 1     D                NTFS   Partition    356 GB  Healthy
  5.   Volume 2                      FAT32  Partition    260 MB  Healthy    System
  6.   Volume 3     F                NTFS   Partition   1024 MB  Healthy
  7.   Volume 4         New Volume   ReFS   Partition   7165 MB  Healthy
  8.   Volume 5     E       New Vol  NTFS   Partition      9 GB  Healthy
复制代码
上面 volume 4 获取盘符就会出错
作者: idwma    时间: 2021-8-8 13:52

本帖最后由 idwma 于 2021-8-8 15:03 编辑

再改一下加个判断
还是套娃嘛一层不行就两层...
  1. @echo off&setlocal enabledelayedexpansion
  2. chcp 437
  3. echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
  4. if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit
  5. for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  6. if exist %%b:\windows\system32 (
  7. (echo select volume %%a
  8. echo delete volume)|diskpart
  9. call :re
  10. for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list disk^)^|diskpart^|findstr "*"') do set disk=%%c
  11. )
  12. )
  13. :ll
  14. for /f "tokens=2 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  15. for /f "tokens=2 delims=* " %%b in ('^(echo sel vol %%a ^&echo list disk^)^|diskpart^|findstr "*"') do (
  16. if "!disk!"=="%%b" (
  17. (echo select volume %%a
  18. echo delete volume)|diskpart
  19. goto :ll
  20. )
  21. )
  22. )
  23. pause
  24. goto :eof
  25. :re
  26. for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list part^)^|diskpart^|findstr "System Reserved Recovery"') do (
  27. if not "%%c"=="" (
  28. (echo select volume %%a
  29. echo sel part %%c
  30. echo del part override)|diskpart
  31. goto :re
  32. )
  33. )
复制代码

作者: 5i365    时间: 2021-8-8 15:12

本帖最后由 5i365 于 2021-8-8 15:13 编辑

回复 26# idwma


    刚试了一下, 误删了一个卷标不是no的分区, 留下了一个卷标是no分区
作者: 5i365    时间: 2021-8-8 15:48

回复 26# idwma


现在问题是不稳定, 有时可以正确删除, 有时就不行, 比如下面的分区情况:

_______________________________________________________________________
删除前硬盘分区信息:

    Active code page: 437

X:\Users\Administrator>diskpart

Microsoft DiskPart version 10.0.19041.1

Copyright (C) Microsoft Corporation.
On computer: winpe

DISKPART> sel disk 0

Disk 0 is now the selected disk.

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System            1027 MB  1024 KB
  Partition 2    Primary             20 GB  1028 MB
  Partition 3    Primary             20 GB    21 GB
  Partition 4    Primary             20 GB    41 GB
  Partition 5    Primary             20 GB    61 GB
  Partition 6    Recovery            20 GB    81 GB
  Partition 9    Reserved            20 GB   101 GB
  Partition 10   Primary             59 GB   121 GB
  Partition 7    Unknown             36 GB   181 GB
  Partition 8    Unknown             13 GB   217 GB

DISKPART> detail disk

Hitachi HDP725025GLA380
Disk ID: {33E8B399-451F-43F3-BB00-A1116C0B80AE}
Type   : SATA
Status : Online
Path   : 0
Target : 0
LUN ID : 0
Location Path : PCIROOT(0)#PCI(1F02)#ATA(C00T00L00)
Current Read-only State : No
Read-only  : No
Boot Disk  : No
Pagefile Disk  : No
Hibernation File Disk  : No
Crashdump Disk  : No
Clustered Disk  : No

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     C   no           NTFS   Partition     20 GB  Healthy
  Volume 1     D   no           NTFS   Partition     20 GB  Healthy
  Volume 2     E   data         NTFS   Partition     20 GB  Healthy
  Volume 3     F   no           NTFS   Partition     20 GB  Healthy
  Volume 4     G                RAW    Partition     20 GB  Healthy
  Volume 5     H   soft         NTFS   Partition     59 GB  Healthy
  Volume 6                      FAT32  Partition   1027 MB  Healthy    Hidden

DISKPART> list vol

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     C   no           NTFS   Partition     20 GB  Healthy
  Volume 1     D   no           NTFS   Partition     20 GB  Healthy
  Volume 2     E   data         NTFS   Partition     20 GB  Healthy
  Volume 3     F   no           NTFS   Partition     20 GB  Healthy
  Volume 4     G                RAW    Partition     20 GB  Healthy
  Volume 5     H   soft         NTFS   Partition     59 GB  Healthy
  Volume 6                      FAT32  Partition   1027 MB  Healthy    Hidden

_________________________________________________________________
删除后硬盘分区信息:
Active code page: 437

X:\Users\Administrator>diskpart

Microsoft DiskPart version 10.0.19041.1

Copyright (C) Microsoft Corporation.
On computer: winpe

DISKPART> sel disk 0

Disk 0 is now the selected disk.

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 4    Primary             20 GB    41 GB
  Partition 5    Primary             20 GB    61 GB
  Partition 7    Unknown             36 GB   181 GB
  Partition 8    Unknown             13 GB   217 GB

DISKPART> detail disk

Hitachi HDP725025GLA380
Disk ID: {33E8B399-451F-43F3-BB00-A1116C0B80AE}
Type   : SATA
Status : Online
Path   : 0
Target : 0
LUN ID : 0
Location Path : PCIROOT(0)#PCI(1F02)#ATA(C00T00L00)
Current Read-only State : No
Read-only  : No
Boot Disk  : No
Pagefile Disk  : No
Hibernation File Disk  : No
Crashdump Disk  : No
Clustered Disk  : No

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  Volume 0     E   data         NTFS   Partition     20 GB  Healthy
  Volume 1     F   no           NTFS   Partition     20 GB  Healthy

DISKPART>
作者: 5i365    时间: 2021-8-8 16:02

回复 26# idwma

又试了一下上面的新代码,

现在情况,卷标为no的分区都删了, 但是 esp分区, msr分区,rec分区,没有删
作者: idwma    时间: 2021-8-8 16:35

回复 29# 5i365


那再改一下换个方式
  1. @echo off
  2. chcp 437
  3. echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
  4. if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit
  5. for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  6. if exist %%b:\windows\system32 (
  7. (echo select volume %%a
  8. echo delete volume)|diskpart
  9. for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list disk^)^|diskpart^|findstr "*"') do set disk=%%c
  10. )
  11. )
  12. :re
  13. for /f "tokens=2 delims= " %%c in ('^(echo select disk %disk% ^&echo list part^)^|diskpart^|findstr /i "System Reserved Recovery"') do (
  14. if not "%%c"=="" (
  15. (echo sel disk %disk%
  16. echo sel part %%c
  17. echo del part override)|diskpart
  18. goto :re
  19. )
  20. )
  21. :ll
  22. for /f "tokens=2 delims= " %%a in ('^(echo select disk %disk% ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
  23. if not "%%a"=="" (
  24. (echo select volume %%a
  25. echo delete volume)|diskpart
  26. goto :ll
  27. )
  28. )
  29. pause
复制代码

作者: 5i365    时间: 2021-8-8 16:54

回复 30# idwma

感谢, 测了多次了, 感觉这回没问题了, 但是还没有试多块硬盘时什么情况,

现在的方法,好像没有最开始   方法一代码中   的开头几行判断多个硬盘的部分,下面是原来的方法一代码

方法一代码:
@echo off&setlocal enabledelayedexpansion
chcp 437
for /f "delims=" %%i in ('^(echo list disk ^)^|diskpart^|find "Online"') do set/a n+=1
        set/a n=!n!-1
        for /l %%i in (0,1,!n!) do ((echo select disk %%i
&echo detail disk)|diskpart|findstr /i "volume.*no" &&set f=%%i)
                if not defined f start mshta vbscript:msgbox("not find no",0,"tip")(window.close)&&exit
                for /l %%i in (0,1,!n!) do (
                        for /f "tokens=2,3 delims= " %%a in ('^(echo select disk %%i ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
                                if exist %%b:\windows\system32 (
                                        (echo select disk %%i
                                        echo select volume %%a
                                        echo delete volume)|diskpart
                                        for /f "tokens=2 delims= " %%c in ('^(echo select disk %%i ^&echo list part^)^|diskpart^|findstr /i "system Reserved Recovery"') do (
                                                if not "%%c"=="" (
                                                (echo sel disk %%i
                                                echo sel part %%c
                                                echo del part override)|diskpart)
                                        )
                                )
                        )
                )
pause
作者: idwma    时间: 2021-8-8 16:59

通用定位有windows目录的卷来定位硬盘也一样的,可以少循环几次
作者: 5i365    时间: 2021-8-8 17:00

另外, 感觉上面的方法一的代码, 执行速度快

能否在方法一代码的基础上改一下?
作者: idwma    时间: 2021-8-8 17:04

回复 33# 5i365


    每次删完一个分区顺序会变,要重新获取一次位置这步省不了是慢一点
作者: 5i365    时间: 2021-8-8 17:22

回复 34# idwma

哦, 我在无忧看到过一种方式删分区, 非常快, 几乎是秒删的

原理大概是, 先把获取硬盘信息, 然后根据要求生成要删除的代码, 之后定向到外部文件, 然后用用下面方法执行这个文件
diskpart /s 生成的删除代码文件
作者: 5i365    时间: 2021-8-8 17:23

回复 35# idwma


    对 是硬盘0的意思, 就是备份硬盘0的分区表
作者: 5i365    时间: 2021-8-8 17:37

回复 35# idwma

备份分区表的代码, 应该是备份要操作的硬盘, 有可能是 硬盘0 或1 或2 , 所以放在最开始, 无法知道硬盘号, 行不通

另外, 因为只处理包含卷标no的分区, 且包含windows系统的硬盘, 所以感觉还是方法一代码那个合适
作者: idwma    时间: 2021-8-8 17:38

本帖最后由 idwma 于 2021-8-8 17:54 编辑

回复 36# 5i365

你看11行就是定位硬盘一样的
    不太清楚这样是不是顺序不会变可以试试
  1. @echo off
  2. if exist dsk.txt del dsk.txt
  3. chcp 437
  4. echo list vol|diskpart|findstr /i "volume.*no" &&set f=1
  5. if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit
  6. for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  7. if exist %%b:\windows\system32 (
  8. for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list disk^)^|diskpart^|findstr "*"') do set disk=%%c &BOOTICE /DEVICE=%%c /mbr /backup /sectors=1 /quiet /file=MBR_Bak
  9. (echo select volume %%a
  10. echo delete volume)|diskpart
  11. )
  12. )
  13. for /f "tokens=2 delims= " %%c in ('^(echo select disk %disk% ^&echo list part^)^|diskpart^|findstr /i "System Reserved Recovery"') do (
  14. if not "%%c"=="" (
  15. (echo sel disk %disk%
  16. echo sel part %%c
  17. echo del part override)>>dsk.txt
  18. )
  19. )
  20. for /f "tokens=2 delims= " %%a in ('^(echo select disk %disk% ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
  21. if not "%%a"=="" (
  22. (echo select volume %%a
  23. echo delete volume)>>dsk.txt
  24. )
  25. )
  26. echo;exit>>dsk.txt
  27. if exist dsk.txt diskpart /s dsk.txt
  28. del dsk.txt
  29. for /f "tokens=3 delims= " %%c in ('echo list vol^|diskpart^|findstr /i "volume.*data"') do set data_pf=%%c
  30. set no_yph=%disk%
  31. pause
复制代码

作者: 5i365    时间: 2021-8-8 17:47

回复 39# idwma


    第三行,的备份分区表代码, 要操作的硬盘号,还不知道, 因为在PE下也有可能是硬盘1或2,
如果用方法一的代码, 我认为应该将备份分区表代码放下面的位置

方法一代码:
@echo off&setlocal enabledelayedexpansion
chcp 437
for /f "delims=" %%i in ('^(echo list disk ^)^|diskpart^|find "Online"') do set/a n+=1
        set/a n=!n!-1
        for /l %%i in (0,1,!n!) do ((echo select disk %%i &echo detail disk)|diskpart|findstr /i "volume.*no" &&set f=%%i)
                if not defined f start mshta vbscript:msgbox("not find no",0,"tip")(window.close)&&exit
                for /l %%i in (0,1,!n!) do (
                        for /f "tokens=2,3 delims= " %%a in ('^(echo select disk %%i ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
                                if exist %%b:\windows\system32 (
                                              BOOTICE /DEVICE=硬盘号 /mbr /backup /sectors=1 /quiet /file=MBR_Bak
                                        (echo select disk %%i
                                        echo select volume %%a
                                        echo delete volume)|diskpart
                                        for /f "tokens=2 delims= " %%c in ('^(echo select disk %%i ^&echo list part^)^|diskpart^|findstr /i "system Reserved Recovery"') do (
                                                if not "%%c"=="" (
                                                (echo sel disk %%i
                                                echo sel part %%c
                                                echo del part override)|diskpart)
                                        )
                                )
                        )
                )
pause
作者: 5i365    时间: 2021-8-8 17:54

回复 39# idwma


    测试过了, 没有遇到问题, 速度也快了, 感觉代码还可以精简  


备份硬盘分区表, 那个硬盘参数, 要改, 能否使用方法1的代码改一下呢?
作者: idwma    时间: 2021-8-8 17:56

回复 40# 5i365


    改了,应该可正常备份了
方法一不稳
作者: newswan    时间: 2021-8-8 18:30

本帖最后由 newswan 于 2021-8-8 18:41 编辑

定位硬盘不行,分区号也会自动变
卷号,按大到小排序
  1. cmd /c "echo list vol" ^| diskpart ^| findstr /i /r /C:"Volume [0-9]" ^| sort /r
复制代码
剩下的你自己改

测试
  1. DISKPART>
  2.   Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  3.   ----------  ---  -----------  -----  ----------  -------  ---------  --------
  4.   Volume 0     C                NTFS   Partition    100 GB  Healthy    Boot
  5.   Volume 1     D                NTFS   Partition    138 GB  Healthy
  6.   Volume 2                      FAT32  Partition    260 MB  Healthy    System
  7.   Volume 3                      RAW    Partition    260 MB  Healthy    Hidden
  8.   Volume 4                      RAW    Partition   1023 MB  Healthy
  9.   Volume 5                      RAW    Partition   4096 MB  Healthy
  10. DISKPART> 5
  11. 4
  12. 3
  13. 2
  14. 1
  15. 0
复制代码

作者: newswan    时间: 2021-8-8 18:48

总之就是 卷号倒序, 盘符,两个方法
或者没有盘符先分配盘符
作者: 5i365    时间: 2021-8-8 20:34

回复 43# newswan


    感谢指点, 感觉在PE下分配盘符,有时不太可靠,目前还是感觉分区号稳点
作者: 5i365    时间: 2021-8-9 07:31

本帖最后由 5i365 于 2021-8-9 10:22 编辑

回复 38# idwma

第五行代码的中文部分,在使用chcp 437后,会显示乱码, 有办法显示中文吗:?
if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit

找到一文章,但不知道修改
https://www.cnblogs.com/tsoukw/archive/2010/10/20/1856497.html
______________________________________________________________________
另外还有一个问题,
第32行, 回显硬盘号,后面会有一个空格,怎样在开始获取硬盘号的地方,删除空格?
例如:
echo %no_yph%abc
输出的结果是0 abc
作者: idwma    时间: 2021-8-9 12:59

回复 45# 5i365


    提示的中文显示多加个判断
变量的后面习惯性的多打了个空格
  1. @echo off
  2. chcp 437
  3. echo list vol|diskpart|findstr /i "volume.*no" &&set f=1||chcp 936
  4. if not defined f start mshta vbscript:msgbox("没找到卷标为no的分区",0,"%提醒%")(window.close)&&exit
  5. if exist dsk.txt del dsk.txt
  6. for /f "tokens=2,3 delims= " %%a in ('echo list vol^|diskpart^|findstr /i "volume.*no"') do (
  7. if exist %%b:\windows\system32 (
  8. for /f "tokens=2 delims=* " %%c in ('^(echo sel vol %%a ^&echo list disk^)^|diskpart^|findstr "*"') do set disk=%%c&BOOTICE /DEVICE=%%c /mbr /backup /sectors=1 /quiet /file=MBR_Bak
  9. (echo select volume %%a
  10. echo delete volume)|diskpart
  11. )
  12. )
  13. for /f "tokens=2 delims= " %%c in ('^(echo select disk %disk% ^&echo list part^)^|diskpart^|findstr /i "System Reserved Recovery"') do (
  14. if not "%%c"=="" (
  15. (echo sel disk %disk%
  16. echo sel part %%c
  17. echo del part override)>>dsk.txt
  18. )
  19. )
  20. for /f "tokens=2 delims= " %%a in ('^(echo select disk %disk% ^&echo detail disk^)^|diskpart^|findstr /i "volume.*no"') do (
  21. if not "%%a"=="" (
  22. (echo select volume %%a
  23. echo delete volume)>>dsk.txt
  24. )
  25. )
  26. echo;exit>>dsk.txt
  27. if exist dsk.txt diskpart /s dsk.txt
  28. del dsk.txt
  29. for /f "tokens=3 delims= " %%c in ('echo list vol^|diskpart^|findstr /i "volume.*data"') do set data_pf=%%c
  30. set no_yph=%disk%
  31. pause
复制代码

作者: 5i365    时间: 2021-8-9 19:42

本帖最后由 5i365 于 2021-8-9 19:44 编辑

回复 46# idwma

第14-20行
for /f "tokens=2 delims= " %%c in ('^(echo select disk %disk% ^&echo list part^)^|diskpart^|findstr /i "System Reserved Recovery"') do (
        if not "%%c"=="" (
                (echo sel disk %disk%
                echo sel part %%c
                echo del part override)>>dsk.txt
        )
)

你好,大侠,能增强一下上面几行代码的功能吗? 改成类似下面的,用分区类型的ID来表示的形式,这样我如果想删除其它系统下的某分区类型的分区,就直接在后加分区类型的ID就可以了,这样功能就没强大多了
for /f "tokens=2 delims= " %%c in ('^(echo select disk %disk% ^&echo list part^)^|diskpart^|findstr /i "C12A7328-F81F-11D2-BA4B-00A0C93EC93B DE94BBA4-06D1-4D40-A16A-BFD50179D6AC E3C9E316-0B5C-4DB8-817D-F92DF00215AE 其它系统下分区类型的ID"')

★★★需要增强的原因是:

所有windows相关的分区类型,因为本身就是微软的东西, 他们都有英文名字, 像System、 Reserved、 Recovery
但是更多的其它系统,像苹果系统,linux等系统下的分区类型,却没有名字,统一显示为Unknown
但好在,每种分区类型,在分区的详情中都有一串字符ID来表示这种类型,例如:查看一个 system类型分区的详情,里面有下面的内容
Type: C12A7328-F81F-11D2-BA4B-00A0C93EC93B

Windows下的一些分区,英文类型名字和其ID的对应关系如下
system
C12A7328-F81F-11D2-BA4B-00A0C93EC93B

recovery
DE94BBA4-06D1-4D40-A16A-BFD50179D6AC

reserved
E3C9E316-0B5C-4DB8-817D-F92DF00215AE
_______________________________________________________
附获取分区类型详情的步骤:

Active code page: 437

C:\Users\Administrator>diskpart

Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: WIN

DISKPART> sel disk 0

Disk 0 is now the selected disk.

DISKPART> list part

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System            1027 MB  1024 KB
  Partition 2    Primary             80 GB  1028 MB
  Partition 3    Primary            112 GB    81 GB
  Partition 4    Primary             29 GB   193 GB

DISKPART> sel part 1

Partition 1 is now the selected partition.

DISKPART> detail part

Partition 1
Type    : c12a7328-f81f-11d2-ba4b-00a0c93ec93b
Hidden  : Yes
Required: No
Attrib  : 0X8000000000000000
Offset in Bytes: 1048576

  Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
* Volume 3         EFI          FAT32  Partition   1027 MB  Healthy    System

DISKPART>
作者: idwma    时间: 2021-8-9 19:57

  1. for /f "tokens=2 delims= " %%c in ('^(echo sel disk %disk% ^&echo list part^)^|diskpart^|findstr /i "Partition.*B"') do (
  2. ((echo sel disk %disk%
  3. echo sel partition %%c
  4. echo detail partition)|diskpart|findstr /i "C12A7328-F81F-11D2-BA4B-00A0C93EC93B DE94BBA4-06D1-4D40-A16A-BFD50179D6AC E3C9E316-0B5C-4DB8-817D-F92DF00215AE 其它系统下分区类型的ID"
  5. )&&(
  6. (echo sel disk %disk%
  7. echo sel part %%c
  8. echo del part override)>>dsk.txt
  9. )
  10. )
复制代码
回复 47# 5i365
作者: 5i365    时间: 2021-8-9 20:03

回复 48# idwma


    感谢快速回复, 我有时间再测试一下, 有问题会来反馈




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2