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

TOP

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

TOP

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

TOP

回复 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. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或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 10:59 编辑

回复 18# newswan

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

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

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

哪里出了问题呢?

TOP

回复 19# Batcher

多谢指导, 很想知道大侠, 用什么批处理的IDE调试, 另外很想知道有没有将批处理格式化的工具?

TOP

本帖最后由 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:|= %"'

TOP

回复 22# 5i365


你现在用的方法1还是方法2?

TOP

本帖最后由 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
复制代码

TOP

  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 获取盘符就会出错

TOP

本帖最后由 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. )
复制代码

TOP

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

回复 26# idwma


    刚试了一下, 误删了一个卷标不是no的分区, 留下了一个卷标是no分区

TOP

回复 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>

TOP

回复 26# idwma

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

现在情况,卷标为no的分区都删了, 但是 esp分区, msr分区,rec分区,没有删

TOP

回复 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

评分人数

TOP

返回列表