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 不一样