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

TOP

通用定位有windows目录的卷来定位硬盘也一样的,可以少循环几次

TOP

另外, 感觉上面的方法一的代码, 执行速度快

能否在方法一代码的基础上改一下?

TOP

回复 33# 5i365


    每次删完一个分区顺序会变,要重新获取一次位置这步省不了是慢一点

TOP

回复 34# idwma

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

原理大概是, 先把获取硬盘信息, 然后根据要求生成要删除的代码, 之后定向到外部文件, 然后用用下面方法执行这个文件
diskpart /s 生成的删除代码文件

TOP

回复 35# idwma


    对 是硬盘0的意思, 就是备份硬盘0的分区表

TOP

回复 35# idwma

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

另外, 因为只处理包含卷标no的分区, 且包含windows系统的硬盘, 所以感觉还是方法一代码那个合适

TOP

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

TOP

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

TOP

回复 39# idwma


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


备份硬盘分区表, 那个硬盘参数, 要改, 能否使用方法1的代码改一下呢?

TOP

回复 40# 5i365


    改了,应该可正常备份了
方法一不稳

TOP

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

TOP

总之就是 卷号倒序, 盘符,两个方法
或者没有盘符先分配盘符

TOP

回复 43# newswan


    感谢指点, 感觉在PE下分配盘符,有时不太可靠,目前还是感觉分区号稳点

TOP

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

TOP

返回列表