bjay2008xmy 发表于 2022-8-21 20:56:47

liuyanjun 发表于 2022-8-21 21:29:37

感谢分享 试了下很准确

dos时代菜鸟 发表于 2022-8-22 08:33:03

diskpart 可以接收 管道传递指令
比如 : cmd 下输入
echolist disk | diskpart

我好像有个帖子 ,关于 通过 for 命令 把diskpart 指令集群 通过 管道 传递给 diskpart ,如此就不用 生成临时的 脚本文件了。

旁观者清 发表于 2022-8-22 08:45:39

谢谢分享。

bjay2008xmy 发表于 2022-8-22 12:14:39

szwp 发表于 2022-8-22 12:35:53

(echo sele disk %d%&echo clean&echo convert mbr&echo crea part prim&echo shrink DESIRED=920&echo crea part prim&echo acti&echo list part&echo format fs=fat32 quick label=UESP&echo assign letter=v&echo sele part 1&echo format fs=exfat quick label=UPE&echo assign letter=u)|diskpart

bjay2008xmy 发表于 2022-8-22 12:41:03

bjay2008xmy 发表于 2022-8-22 12:41:43

szwp 发表于 2022-8-22 12:43:14

bjay2008xmy 发表于 2022-8-22 12:41
这个方法我试过,只会提示你此时不应该存在&

俺发在群里,群友用了好多年了。

bjay2008xmy 发表于 2022-8-22 12:56:28

dos时代菜鸟 发表于 2022-8-22 13:10:57

bjay2008xmy 发表于 2022-8-22 12:14
学习了。显示硬盘数量还好办,显示分区数量就搞不定了。你在一个for命令中如何用echo同时把selectdisk...

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=423983&extra=

dos时代菜鸟 发表于 2022-8-22 13:12:40

本帖最后由 dos时代菜鸟 于 2022-8-22 16:31 编辑

用 “type 文本文件内容 | diskpart” 的方法 可以根据输出结果中的 “DISKPART> ” 的数量计算 指令个数,这样就有个初步制作 计数器的 基础思路,其他的,就好办了。
分区编号是 0 的 ,是扩展分区

基本思路就是这样,针对 diskpart 的一些懵瞪 bug 可能需要一些补救措施。此处就不扩展了。



    @echo off
    setlocal ENABLEDELAYEDEXPANSION
    cls
    echo ---------------------------------------%time%
    set p=0
    set "parts="
    rem 获取硬盘编号并生成 探测分区编号的脚本 第一次diskpart
    (
    for /f "skip=9 tokens=2 delims= " %%c in ('echo list disk^|diskpart') do (
      echo select disk %%c
      echo list partition
    )
    )>temp.txt
    rem 获取 分区编号列表变量 parts 第二次 diskpart
    set n=0
    for /f "delims=" %%c in ('type temp.txt^|diskpart') do (
      set "str1=%%c"
      if "%%c"=="DISKPART> " set /a n=n+1
      if "!str1:~0,2!"=="磁盘" set /a d0=!str1:~2,3!
      if "!str1:~2,2!"=="分区" (if not "!str1:~5,1!"=="#" (
            set /a p0=!str1:~5,8!
            if not !p0!==0 (
                set parts=!parts! !d0!.!p0!
                set /a p=p+1
            )
      ))
    )
    set /a d=n/2
    rem 生成获取硬盘分区对应的卷信息的脚本,运行脚本并显示出分区和卷信息
    echo 硬盘 分区 盘符 卷标         格式      大小   状态         信息
    echo ------------------------------------------------------------------------
    (
      for %%c in (!parts!) do (for /f "tokens=1,2 delims=." %%i in ("%%c") do (
            echo select disk %%i
            echo select partition %%j
            echo detail partition
      ))
      echo rem
    )>temp.txt
    rem 第三次 diskpart
    set n=0
    set p0=
    for /f "delims=" %%c in ('type temp.txt ^|diskpart') do (
      set "str1=%%c"
      if "%%c"=="DISKPART> " (
            set /a n=n+1
            set /a x=n/3*3+1
      )
      if "!str1:~0,2!"=="磁盘"set str2=!str1:~2,3!
      if "!str1:~0,2!"=="分区"set p0=!str1:~2,3!
      if "!str1:~0,1!"=="*"   set "str2=!str2! !p0!   !str1:~14,24!   !str1:~50!"
      if !x! equ !n! (if not "!p0!"=="" (
            echo !str2!
            set p0=
      ))
    )
    echo ------------------------------------------------------------------------
    echo 共有!d!个硬盘,!p!个分区。
    echo ---------------------------------------%time%
    pause

bjay2008xmy 发表于 2022-8-22 13:25:58

dos时代菜鸟 发表于 2022-8-22 13:33:24

bjay2008xmy 发表于 2022-8-22 13:25
在for命令中用echo传递多条命令给diskpart确实复杂一点,在for命令外就简单点括号内用&把几条命令连起来 ...

有时需要用 for 循环 实现把 获取所有分区 信息的指令集合 一次性传递给 diskpart,简单的就是 先生成指令文本,再 用 type 把 文本内容 管道传递给diskpart.

dos时代菜鸟 发表于 2022-8-22 13:41:30

本帖最后由 dos时代菜鸟 于 2022-8-22 18:39 编辑

用 diskpart 获取全部 硬盘分区信息 ,难点是 要尽量少的 运行 diskpart ,因为 那玩意儿 启动一次 费时间。所以,就要考虑 事先把 指令都弄粗来,一次性 传递给 diskpart 执行,再 想办法 分析 命令结果,获取 硬盘分区信息。这就避免不了用 计数器。
所以我 考虑 用type 把 指令集 通过管道 传递给 diskpart , 这样和 /s 脚本方式 的区别在于 指令结果中有 “DISKPART> ” 提示符行,每运行一个 diskpart 指令,就 有一个 这样的提示行。这就有了计数器的 基础。经过计算,就可以 分析出 是 那一条指令 输出了什么信息。 这样就 一定能得到 我们所要的数据信息 和结果。

也就是 整体上 运行三次 diskpart 就可以了,不管有多少硬盘 和分区,都只运行 三次 diskpart .就能出结果。

不用 文本,用& 链接也可以,如下:同样需要 用到 for ,只是把"echo diskpart指令" 保存成变量 传递给 diskpart .


    @echo off
    setlocal ENABLEDELAYEDEXPANSION
    cls
    set t1=%time%
    echo ---------------------------------------%time%
    set p=0
    set "parts="
    rem 获取硬盘编号并生成 探测分区编号的脚本 第一次diskpart
    echo 正在探测硬盘编号和数量。。。。。。
    set cmd1=
    for /f "skip=9 tokens=2 delims= " %%c in ('echo list disk^|diskpart') do (
      if "!cmd1!"=="" (
            set cmd1=echo select disk %%c ^& echo list partition
      ) else (
            set cmd1=!cmd1! ^& echo select disk %%c ^& echo list partition
      )
    )
   
    rem 获取 分区编号列表变量 parts 第二次 diskpart
    echo 正在探测分区编号和数量。。。。。。
    set n=0
    for /f "delims=" %%c in ('^(!cmd1!^)^|diskpart') do (
      set "str1=%%c"
      if "%%c"=="DISKPART> " set /a n=n+1
      if "!str1:~0,2!"=="磁盘" set /a d0=!str1:~2,3!
      if "!str1:~2,2!"=="分区" (if not "!str1:~5,1!"=="#" (
            set /a p0=!str1:~5,8!
            if not !p0!==0 (
                set parts=!parts! !d0!.!p0!
                set /a p=p+1
            )
      ))
    )
    set /a d=n/2
    rem 生成获取硬盘分区对应的卷信息的脚本,运行脚本并显示出分区和卷信息
    echo 正在获取分区对应的卷信息。。。。。。
    set cmd1=
    for %%c in (!parts!) do (for /f "tokens=1,2 delims=." %%i in ("%%c") do (
            if "!cmd1!"=="" (
                set cmd1=echo select disk %%i ^& echo select partition %%j ^& echo detail partition
            ) else (
                set cmd1=!cmd1! ^& echo select disk %%i ^& echo select partition %%j ^& echo detail partition
            )
    ))
    set cmd1=!cmd1! ^& echo rem
    rem 第三次 diskpart
    set n=0
    set p0=
    set m=0
    for /f "delims=" %%c in ('^(!cmd1!^) ^|diskpart') do (
      set "str1=%%c"
      if "%%c"=="DISKPART> " (
            set /a n=n+1
            set /a x=n/3*3+1
      )
      if "!str1:~0,2!"=="磁盘"set d0=!str1:~2,3!
      if "!str1:~0,2!"=="分区"set p0=!str1:~2,3!
      if "!str1:~0,1!"=="*"   set "str2=!str1:~14,24!   !str1:~50!"
      if !x! equ !n! (if not "!p0!"=="" (
            set /a m=m+1
            set part_!m!=!d0! !p0!      !str2!
            set p0=
            set str2=
      ))
    )
    set t2=%time%
   
    rem 显示结果
    cls
    echo ---------------------------------------%t1%
    echo.
    echo 硬盘 分区 盘符 卷标         格式      大小   状态         信息
    echo ------------------------------------------------------------------------
    for /l %%c in (1,1,!p!)do (echo !part_%%c!)
    echo ------------------------------------------------------------------------
    echo.
    echo 共有!d!个硬盘,!p!个分区。
    echo ---------------------------------------%t2%
    pause



bjay2008xmy 发表于 2022-8-22 14:50:36

dos时代菜鸟 发表于 2022-8-22 15:20:38

bjay2008xmy 发表于 2022-8-22 14:50
起码也要分两次才行,第一次先运行list disk命令看看有多少块硬盘,再根据硬盘数量生成显示所有硬盘分区 ...

对,如果需要 获取卷 信息,就 还需要 来一次。

bjay2008xmy 发表于 2022-8-22 15:37:44

dos时代菜鸟 发表于 2022-8-22 15:44:40

bjay2008xmy 发表于 2022-8-22 14:50
起码也要分两次才行,第一次先运行list disk命令看看有多少块硬盘,再根据硬盘数量生成显示所有硬盘分区 ...

如果用 ghost 自带的 omnifs64 可以一次获取出来
用 gdisk64 2次也可以。

dos时代菜鸟 发表于 2022-8-22 15:54:48

本帖最后由 dos时代菜鸟 于 2022-8-22 20:11 编辑

bjay2008xmy 发表于 2022-8-22 15:37
@echo off
Setlocal Enabledelayedexpansion
color 02

硬盘编号不一定是按顺序来的
比如 2u盘 ,拔掉一个。很可能 2号盘没了,3号盘还在。

所以,必须 对 指令输出进行分析,精准获取硬盘编号。

而且 你这个 看不出来 某个分区 属于 哪个硬盘。



bjay2008xmy 发表于 2022-8-22 20:36:23

dos时代菜鸟 发表于 2022-8-22 20:39:12

本帖最后由 dos时代菜鸟 于 2022-8-22 20:40 编辑

bjay2008xmy 发表于 2022-8-22 20:36
分区编号乱序了,要控制
1 6 7 8 9 2 3 4 5
这个 是 分区时先后顺序造成的 是编号,不是序号。不是 人为编的,是 程序编的,不能改。
按照 分区位置先后显示,而他的编号 是按类似 分区创建时间顺序 来的。
看一下 分区的 偏移量 就更能理解了。

darkmoon781015 发表于 2022-8-22 20:57:09

U盘隐藏EFI区,因为分区ID改为42进行隐藏,显示不出来。

dos时代菜鸟 发表于 2022-8-22 22:06:51

darkmoon781015 发表于 2022-8-22 20:57
U盘隐藏EFI区,因为分区ID改为42进行隐藏,显示不出来。

u盘 是 mbr 分区? efi 是 fat32 ?

如果 改了 特殊 id 导致 win 不能识别,不能把其识别为一个win可用的卷 ,diskpart 也 是识别不了的。

bjay2008xmy 发表于 2022-8-22 23:25:19

darkmoon781015 发表于 2022-8-23 10:18:28

bjay2008xmy 发表于 2022-8-22 23:25
打开cmd依次运行如下命令:
1、diskpart
2、list disk


感谢,已经试过了,这种办法确实可以。

bjay2008xmy 发表于 2022-8-23 10:31:15

dos时代菜鸟 发表于 2022-8-23 10:37:31

本帖最后由 dos时代菜鸟 于 2022-8-23 11:23 编辑

相关 功能的 脚本nttwqz 已经做得很完善,我这里只是 照着做个简单举例。就这样吧

很多关键字查询 都用的简体中文,所以 只使用 cp=936 的情况











bjay2008xmy 发表于 2022-8-23 11:29:41

dos时代菜鸟 发表于 2022-8-23 11:50:29

bjay2008xmy 发表于 2022-8-23 11:29


win7 下 diskpart 文本流 skip 跳过的行数 可能跟 win10 不一样
页: [1] 2 3
查看完整版本: 准确判断本机有多少个硬盘和分区