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

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

[复制链接]
 楼主| 发表于 2021-8-8 05:55:36 | 显示全部楼层
本帖最后由 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
 楼主| 发表于 2021-8-8 06:26:14 | 显示全部楼层
本帖最后由 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
发表于 2021-8-8 09:58:17 | 显示全部楼层
本帖最后由 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
发表于 2021-8-8 10:00:44 | 显示全部楼层
回复 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. )
复制代码
 楼主| 发表于 2021-8-8 10:50:16 | 显示全部楼层
本帖最后由 5i365 于 2021-8-8 10:59 编辑

回复 18# newswan

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

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

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

哪里出了问题呢?
 楼主| 发表于 2021-8-8 10:51:53 | 显示全部楼层
回复 19# Batcher

多谢指导, 很想知道大侠, 用什么批处理的IDE调试, 另外很想知道有没有将批处理格式化的工具?
 楼主| 发表于 2021-8-8 12:05:55 | 显示全部楼层
本帖最后由 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:|= %"'
发表于 2021-8-8 12:34:48 | 显示全部楼层
回复 22# 5i365


你现在用的方法1还是方法2?
发表于 2021-8-8 12:43:48 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2021-8-8 12:50:11 | 显示全部楼层

  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 获取盘符就会出错
发表于 2021-8-8 13:52:38 | 显示全部楼层
本帖最后由 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. )

复制代码
 楼主| 发表于 2021-8-8 15:12:24 | 显示全部楼层
本帖最后由 5i365 于 2021-8-8 15:13 编辑

回复 26# idwma


    刚试了一下, 误删了一个卷标不是no的分区, 留下了一个卷标是no分区
 楼主| 发表于 2021-8-8 15:48:07 | 显示全部楼层
回复 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>
 楼主| 发表于 2021-8-8 16:02:21 | 显示全部楼层
回复 26# idwma

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

现在情况,卷标为no的分区都删了, 但是 esp分区, msr分区,rec分区,没有删
发表于 2021-8-8 16:35:45 | 显示全部楼层
回复 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
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 牛X

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 21:14 , Processed in 0.033191 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表