[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] [已解决]如何在批处理中使用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 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
复制代码

TOP

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

回复 2# idwma


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

另外, 当没有卷标为no的分区时, 也没有消息框提示, 闪一下, 没有任何信息出现,就关了

TOP

本帖最后由 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 . . .

TOP

本帖最后由 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

TOP

回复 2# idwma


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

                        echo select volume=%%a
                        echo delete volume noerr)|diskpart

TOP

那再换一个方式
  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
复制代码

TOP

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

我马上测试一下

TOP

回复 8# 5i365

一样的吧我试了一下这样也可以删

TOP

回复 7# idwma

和前面的代码效果一样, 我改了也不行

TOP

本帖最后由 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

TOP

尴尬呀复制你给的信息,有没发现这行少了什么if exist %%b:\windows\system32 (

TOP

本帖最后由 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>

TOP

回复 13# 5i365


    是不是字母大小写的原因,用 findstr /i 试试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 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

TOP

返回列表