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

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

[复制链接]
 楼主| 发表于 2021-8-8 16:54:17 | 显示全部楼层
回复 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
发表于 2021-8-8 16:59:26 | 显示全部楼层
通用定位有windows目录的卷来定位硬盘也一样的,可以少循环几次
 楼主| 发表于 2021-8-8 17:00:01 | 显示全部楼层
另外, 感觉上面的方法一的代码, 执行速度快

能否在方法一代码的基础上改一下?
发表于 2021-8-8 17:04:44 | 显示全部楼层
回复 33# 5i365


    每次删完一个分区顺序会变,要重新获取一次位置这步省不了是慢一点
 楼主| 发表于 2021-8-8 17:22:46 | 显示全部楼层
回复 34# idwma

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

原理大概是, 先把获取硬盘信息, 然后根据要求生成要删除的代码, 之后定向到外部文件, 然后用用下面方法执行这个文件
diskpart /s 生成的删除代码文件
 楼主| 发表于 2021-8-8 17:23:31 | 显示全部楼层
回复 35# idwma


    对 是硬盘0的意思, 就是备份硬盘0的分区表
 楼主| 发表于 2021-8-8 17:37:21 | 显示全部楼层
回复 35# idwma

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

另外, 因为只处理包含卷标no的分区, 且包含windows系统的硬盘, 所以感觉还是方法一代码那个合适
发表于 2021-8-8 17:38:02 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2021-8-8 17:47:05 | 显示全部楼层
回复 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
 楼主| 发表于 2021-8-8 17:54:45 | 显示全部楼层
回复 39# idwma


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


备份硬盘分区表, 那个硬盘参数, 要改, 能否使用方法1的代码改一下呢?
发表于 2021-8-8 17:56:15 | 显示全部楼层
回复 40# 5i365


    改了,应该可正常备份了
方法一不稳
发表于 2021-8-8 18:30:27 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2021-8-8 18:48:40 | 显示全部楼层
总之就是 卷号倒序, 盘符,两个方法
或者没有盘符先分配盘符
 楼主| 发表于 2021-8-8 20:34:03 | 显示全部楼层
回复 43# newswan


    感谢指点, 感觉在PE下分配盘符,有时不太可靠,目前还是感觉分区号稳点
 楼主| 发表于 2021-8-9 07:31:02 | 显示全部楼层
本帖最后由 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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