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

回复 18# newswan

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

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

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

哪里出了问题呢?

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

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

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

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

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

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

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

回复 7# idwma

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

TOP

回复 8# 5i365

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

TOP

你好,第七,八行,好像错了, 应该是
                        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

回复 2# idwma


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

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

TOP

返回列表