无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 57379|回复: 189
打印 上一主题 下一主题

[原创] dpinfo 2.6.5 beta2 磁盘分区信息 分区相关工具定制脚本

    [复制链接]
1#
发表于 2018-6-13 09:20:08 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-13 10:15 编辑

请教 :能否确定 ,diskpart 识别为gpt  "系统" 的分区 Id 一定是  efi 的 c12a7328-f81f-11d2-ba4b-00a0c93ec93b 么?

真是代码简洁高效啊,这相当于把列表全都放到内存了。就是不知道 cmd 下 支持 存放多少内存。





我喜欢尽量减少 外部命令的调用,宁可 多用几行  for + if .比如

  1. echo %select%|findstr /r "^[0-9]*$" >nul 2>nul
  2. if not %errorlevel%==0 (

  3. )
复制代码
用下面这个,  可节省 调用 外部命令 findstr

  1. set /a select=%select%
  2. if %select% equ 0 (

  3. )
复制代码


可能是我 有 迂腐了,呵呵。

回复

使用道具 举报

2#
发表于 2018-6-13 10:18:57 | 显示全部楼层
freesoft00 发表于 2018-6-13 09:53
应该是固定的。
https://baike.baidu.com/item/%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80%E6%A0%87%E8%AF%8 ...

用  diskpart 的 SETID 可以 察觉到这个,但我还是不太确定,这下 明确了。
回复

使用道具 举报

3#
发表于 2018-6-13 11:05:42 | 显示全部楼层
nttwqz 发表于 2018-6-13 11:01
你不说我还真没考虑过还有其它ID一说,我不是简单看了下帮助

只是findstr用这顺手而已,如果替代不麻烦 ...

最后一步 写入文件的。呵呵。
回复

使用道具 举报

4#
发表于 2018-6-13 12:04:36 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-13 12:23 编辑


运行  diskpart 脚本 我现在都用
  1. type  脚本名 | diskpart
复制代码
的方式

因为  select 命令 没有 noerr 参数 如果选择错误 就会中断脚本。

我有个u盘 就是这样,select disk 到这个盘,diskpart 会自动选择 盘上的 partition ,而手动选,有选不上,说选择错误,结果 脚本运行就断了。

而  用 type 传递 就不会有这问题,而且 会将每个命令结果 用  "DISKPART> " 隔开,也便于查找命令结果,判断命令完成情况。可 通过对 输出文本流中 "DISKPART> "计数来 定位提取数据。
type 也是内部命令。


看效果

  1. ---脚本内容--------------------------------------
  2. select disk 4
  3. select part 1
  4. detail disk
  5. detail part
  6. detail vol

  7. ---用diskpart /s 运行脚本-----------------------------
  8. diskpart /s s.txt
  9. --------------------------------------------------------
  10. Microsoft DiskPart 版本 10.0.14393.0

  11. Copyright (C) 1999-2013 Microsoft Corporation.
  12. 在计算机上: DESKTOP-VS864R9

  13. 磁盘 4 现在是所选磁盘。

  14. 没有选择分区。

  15. Lenovo USB Flash Drive USB Device
  16. 磁盘 ID: 00000001
  17. 类型   : USB
  18. 状态 : 联机
  19. 路径   : 0
  20. 目标 : 0
  21. LUN ID : 0
  22. 位置路径 : UNAVAILABLE
  23. 当前只读状态: 否
  24. 只读: 否
  25. 启动磁盘: 否
  26. 页面文件磁盘: 否
  27. 休眠文件磁盘: 否
  28. 故障转储磁盘: 否
  29. 群集磁盘  : 否

  30.   卷 ###      LTR  标签         FS     类型        大小     状态       信息
  31.   ----------  ---  -----------  -----  ----------  -------  ---------  --------
  32. * 卷     10    J   USB_FILES    FAT32  可移动         7660 MB  正常                 

  33. 没有选择分区。
  34. 请选择一个分区,再试一次。
  35. ------------------------------------------------------------------------------


  36. ----------用 type 把脚步传递个 diskpart 执行---------------
  37. type s.txt | diskpart
  38. -----------------------------------------------------------
  39. Microsoft DiskPart 版本 10.0.14393.0

  40. Copyright (C) 1999-2013 Microsoft Corporation.
  41. 在计算机上: DESKTOP-VS864R9

  42. DISKPART>
  43. 磁盘 4 现在是所选磁盘。

  44. DISKPART>
  45. 没有选择分区。

  46. DISKPART>
  47. Lenovo USB Flash Drive USB Device
  48. 磁盘 ID: 00000001
  49. 类型   : USB
  50. 状态 : 联机
  51. 路径   : 0
  52. 目标 : 0
  53. LUN ID : 0
  54. 位置路径 : UNAVAILABLE
  55. 当前只读状态: 否
  56. 只读: 否
  57. 启动磁盘: 否
  58. 页面文件磁盘: 否
  59. 休眠文件磁盘: 否
  60. 故障转储磁盘: 否
  61. 群集磁盘  : 否

  62.   卷 ###      LTR  标签         FS     类型        大小     状态       信息
  63.   ----------  ---  -----------  -----  ----------  -------  ---------  --------
  64. * 卷     10    J   USB_FILES    FAT32  可移动         7660 MB  正常                 

  65. DISKPART>
  66. 没有选择分区。
  67. 请选择一个分区,再试一次。

  68. DISKPART>
  69.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  70.   --------  -------------  -------  -------  ---  ---
  71. * 磁盘 4    联机             7660 MB      0 B         

  72. 只读                   : 否
  73. 隐藏                   : 否
  74. 没有默认驱动器号       : 否
  75. 卷影副本               : 否
  76. 脱机                : 否
  77. BitLocker 已加密       : 否
  78. 可安装            : 否

  79. 卷容量                 : 7645 MB
  80. 卷可用空间             : 3395 MB

  81. DISKPART>
复制代码

选不了那个分区,可 list part 的时候 却 加了 *
  1. DISKPART> select disk 4

  2. 磁盘 4 现在是所选磁盘。

  3. DISKPART> list part

  4.   分区 ###       类型              大小     偏移量
  5.   -------------  ----------------  -------  -------
  6. * 分区      1    主要                7660 MB      0 B

  7. DISKPART>
复制代码



回复

使用道具 举报

5#
发表于 2018-6-13 12:25:19 | 显示全部楼层
wdtx 发表于 2018-6-13 12:17
非常实用的工具,希望增加挂载盘符读写ESP分区功能,谢谢。

读写 某个卷 的 软件 有很多,个人认为 楼主 只要 提供 挂盘符 功能就足够了。其他的 用户自己选择。
回复

使用道具 举报

6#
发表于 2018-6-13 13:40:59 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-13 13:49 编辑
Anson4 发表于 2018-6-13 12:37
请问 findstr fsutil 需要什么版本?
正常系统英文版 Windows 10 1803,运行出现下图(管理员权限也是): ...


英文环境,怎么能在  cmd 下显示中文呢?
在脚本前端加入
  1. mode con: cp select=936
复制代码


难道是  diskpart 缺少  中文语言文件?
用这个 的 中文版 看看,能不能正常,如果能,就说明 是 diskpart 却语言文件导致的。
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

7#
发表于 2018-6-13 14:09:23 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-13 15:08 编辑
nttwqz 发表于 2018-6-13 13:56
没想到还有这样的妙用,type类似的妙用还真不少。有空了试一下,看那种判断更简洁好用。

我正好有这 ...

detail disk 获取 vol 信息没有问题,但是 怎么来获取 是否 是 active 呢?
如果涉及到 要 select part 的操作可能就不灵了,比如删除分区,不过我没试过 通过 select vol 选中焦点 再delete part 是否会成功.
所以我还是 要做个判断 是否 select part 成功了,如果没成功,就要做个标记,以后 对这个 卷的操作 不能通过 select part 的方式获取焦点。

刚测试,不能被 select part 的分区 只能进行 格式化和分配盘符,其他的都不行,删除、调整大小的都不行,但是 win10 下用 diskpart 干掉该盘全部分区以后新建一个 分区,offset 默认是 1024k ,新建分区就可以 被 select part 了。 不知道以前那个 不能被 select part 的分区是怎么来的,现在没有了,还没办法测试了。呵呵。


如果只是通过  list part 获取 part 信息,可以 用 去掉 整行第一个字符后获得的字符串参与 for 运算,就不用另写判断语句了。不管他有没有 * 都 踢掉了。就是要外面在包裹一层 for 而已。 不然 单独再来一套 命令,会降低效率。
  1. for /f "delims=" %%x in ('type !dpscript! ^|diskpart') do (
  2.   set "lx001=%%x"
  3.   if "!lx001:~0,1!"=="*" set "lx001= !lx001:~1!"
  4. for /f "tokens=1,2" %%a in ("!lx001!") do (
  5.      echo ...
  6.   )
  7. )
复制代码



回复

使用道具 举报

8#
发表于 2018-6-13 15:15:36 | 显示全部楼层
freesoft00 发表于 2018-6-13 13:57
我想到的只是设置两套系统的不同关键词。
批处理先判断系统语言环境,然后根据环境使用不同的关键词作为 ...

我也是这个思路,但是批处理毕竟是给不同语言的人用的,需要人类语言交互的。还是要用 语言 在界面上显示信息告诉 用户的,就是 这部分 交互文字 翻译起来费劲。
跟 电脑交流的 需要几个词 就 记载几个词也就是了。
我的那个  diskpart 的 cmd 中文版是可以 在 英文cp=437 环境下 准确生成列表的,关键是 给人看的 还有 主菜单、提示语等等。这些玩意儿不翻译也不行啊。

点评

英文好的也没有人愿意去翻译这些。玩的人少。 英文不好没有办法。我都是谷歌、百度、bing来回翻译的。 bing翻译成英文,然后英文复制到百度看是否能正确翻译成中文,然后再到谷歌试试是否能正确翻译成中文。 然  详情 回复 发表于 2018-6-13 17:00
回复

使用道具 举报

9#
发表于 2018-6-13 19:58:29 | 显示全部楼层
Anson4 发表于 2018-6-13 17:23
其实不一定是老外,在国内外资公司的办事处基本都要求用英文系统。

老外里面搞 win 系统维护的 有多少?
搞系统维护的 用 diskpart 搞分区 又有多少?

点评

英文系统未必就是老外用,也未必就是老外维护。 这个没必要讨论下去,我也就是这么一说而已。  详情 回复 发表于 2018-6-13 20:27
应该说现在还用dos的还有多少?  详情 回复 发表于 2018-6-13 20:27
回复

使用道具 举报

10#
发表于 2018-6-15 08:12:33 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-15 09:18 编辑
nttwqz 发表于 2018-6-14 23:58
set /a 判断纯数字漏洞太多,你不妨试试 “5i” “5 i” 这样的情况,我尝试了一番之后才使用这个“比较 ...

还真是奇怪 的写法啊。需要研究学习下。

那个 意思好像是  明确 字符串中 除字母和数字以外的字符都是不合法的,包括 加减乘除符号、句号、逗号、分号等也是不合法的,任何一个数字、字母都可以是 文本流行内字段分隔符,而只截取被分割的两个字段


这样 如果 用户输入的 是一个 要 需要计算机 计算的 表达式呢? 还得 研究着 改改。

捕获.PNG (40.52 KB, 下载次数: 277)

捕获.PNG

点评

他那方法我试过,别说表达式,就是特殊符号,比如^|都支持  详情 回复 发表于 2018-6-15 09:44
回复

使用道具 举报

11#
发表于 2018-6-15 20:48:33 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-15 22:40 编辑
nttwqz 发表于 2018-6-15 09:44
他那方法我试过,别说表达式,就是特殊符号,比如^|都支持

要是遇到 以 = 或 , 开头的,或者其他特殊符号开头的。 可能还是不行

干脆如下命令看看行不行吧。
  1. set /a x=运算表达式 2>nul || set /a x=0
复制代码


呵呵呵,感觉好像走弯路了。
回复

使用道具 举报

12#
发表于 2018-6-16 06:56:20 来自手机 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-16 09:33 编辑
pznpt 发表于 2018-6-15 23:59
eol^= 在这里应该是多余的。
在 %你的字符串% 前后加上一个 # 字符,一是防止 %你的字符串% 为空值而 ...

直接set /a 赋值,把反馈>nul,用errorlevel做判断,不成功就赋值成0 ,就完事儿了。
字符串合理的自然赋值成功,不合理的自然失败为0.

点评

楼主好像是判断输入字符串是否为纯数字(digit),而不是判断是否为合法的数(number)。 -2, 0x3c, 3.14, 1.24560000e+005 这些都是合法的数,并不代表这些数就是纯数字。因为这些字符串里面含有非0-9字符。 set  详情 回复 发表于 2018-6-16 09:51
回复

使用道具 举报

13#
发表于 2018-6-16 10:07:20 来自手机 | 显示全部楼层
pznpt 发表于 2018-6-16 09:51
楼主好像是判断输入字符串是否为纯数字(digit),而不是判断是否为合法的数(number)。

-2, 0x3c, 3.14, ...

他是要通过用户输入的数字参与下一步判断数字大小是否在范围内,比较大下这事儿,要求变量是数字。

点评

嗯,可能是我理解错了吧。  详情 回复 发表于 2018-6-16 10:55

评分

参与人数 1无忧币 +5 收起 理由
freesoft00 + 5

查看全部评分

回复

使用道具 举报

14#
发表于 2018-6-17 15:36:13 来自手机 | 显示全部楼层
nttwqz 发表于 2018-6-16 23:26
如果选项有1-10,那么除了1、2、3、4、5、6、7、8、9、10之外的都不合法,我需要这么判断。

那我建议就用 for /l 对用户输入数据做 ==  判断 ,不能用 数学比较大小的方法了。

点评

我也在考虑要不要用这种方法,毕竟这种方法一下子就把非选项中的判断出来了,毕竟可以多加几个if...else...提高判断效率,而且即使字母列列表也可以用for。 今天一直在尝试提高脚本执行效率,但是却发现,分析结  详情 回复 发表于 2018-6-17 16:12
回复

使用道具 举报

15#
发表于 2018-6-17 16:44:36 | 显示全部楼层
nttwqz 发表于 2018-6-17 16:12
我也在考虑要不要用这种方法,毕竟这种方法一下子就把非选项中的判断出来了,而且即使字母列列表也可以 ...

第三方软件,可以考虑用 分区助手,一下 信息全来了。支持 命令行。
如果不用 分区助手,用 注册表,我没试过,估计都是基于  vol 的信息。或者用 vbs 也只是 到 扩展分区,扩展分区下的逻辑分区 就 都显示的 一个分区号上,而且 有的 pe 还没有 vbs . 毕竟 是要用  diskpart 做事情,信息采集 如果跟 diskpart 不一致就不好弄。
回复

使用道具 举报

16#
发表于 2018-6-17 16:57:29 | 显示全部楼层
建议 把 vol 号 记录上,因为 有的分区 不能被 sele part 选择上,到时候 要分配盘符,就必须 sele vol 来定位它。

点评

好说,多定义一个变量而已,已简单加入。 [attachimg]373064[/attachimg]  详情 回复 发表于 2018-6-17 18:41
回复

使用道具 举报

17#
发表于 2018-6-17 22:11:38 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-17 22:48 编辑
nttwqz 发表于 2018-6-17 18:41
好说,多定义一个变量而已,已简单加入。


突然想起一个事儿,不一定 用得到。

如果 你想在脚本中以后还用到 这个 表中的信息 ,比如截取 某个分区的 盘符 或者 vol 编号,那么 就会用到  
for /f "tokens=1-n " %%x in () do ()
这样 截取 某行 第几个单词 的问题,可是你有的 字段占位 是 空格的,这样,截取单词的时候就可能 截取到别的地方去了。除非你用 精准截取 字符串 中某几个 位置的 字符的方式来获取 想要的信息。

所以 我建议你 把没有内容的 空字段内容 用一个 字符代替之,比如 . * @ 之类的。以后判断上也方便,如果 截取到的是 特定的 字符,就说明 这个字段 没有可用信息。
当然,如果以后 不需要 通过这个表 截取数据 ,或者不用 for /f 的方式截取 字段单词 的话,也就无所谓了。


还有个 想法。
如果能 确定 硬盘分区结构 是 mbr 还是 gpt 的话, 就可以 将  act /esp 合一了,不用两列,gpt 结构不存在 act 的情况。另外 一个 gpt 硬盘可能 存在 多个 efi 分区。

点评

  我猜,你应该没仔细看我的脚本,我的脚本功能简单,目前不足300行,不像你的已经快1000行了,还是容易看的,毕竟我这本身就没打算写成diskpart GUI,就算写成了,估计我自己都懒得用,因为有功能强大的DG和分区  详情 回复 发表于 2018-6-17 23:29
回复

使用道具 举报

18#
发表于 2018-6-18 07:04:41 来自手机 | 显示全部楼层
nttwqz 发表于 2018-6-17 23:29
  我猜,你应该没仔细看我的脚本,我的脚本功能简单,目前不足300行,不像你的已经快1000行了,还是 ...

明白了
回复

使用道具 举报

19#
发表于 2018-6-18 07:33:53 来自手机 | 显示全部楼层
nttwqz 发表于 2018-6-17 23:29
  我猜,你应该没仔细看我的脚本,我的脚本功能简单,目前不足300行,不像你的已经快1000行了,还是 ...

你也可以用@表示act.用 星豆 表示esp啊,这样就不用考虑要用空格错位显示了呀。

点评

目前并没有发现错位问题 因为我用了tab键,我倒是觉得你那后面显示不明了,但是你那信息显示太多,对其估计显示不下  详情 回复 发表于 2018-6-18 07:53
回复

使用道具 举报

20#
发表于 2018-6-18 11:38:31 | 显示全部楼层
nttwqz 发表于 2018-6-18 07:53
目前并没有发现错位问题 因为我用了tab键,我倒是觉得你那后面显示不明了,但是你那信息显示太多,对其估 ...

好吧好吧,呵呵,我那个,就不考虑了,信息量多了,能看出来就行了.
回复

使用道具 举报

21#
发表于 2018-6-26 22:35:42 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2018-6-26 23:04 编辑

不知道  detail part 里面的那个 隐藏 是啥定义.
对于 不能 sele part 的 分区,就只能 通过 sele vol 的方式 定位之,还不一定能 通过  detail part 的方式获得这个 数据.就要用 detail vol 的方式获取.
而对于 那些 不是 vol 的分区,比如 id=83 的,,又不能 sele vol 来定位之,又不能通过 detail vol  来获取 这个 隐藏与否的信息.就像下图,

这个隐藏与否的信息着实让人挠头.要是遇到 不能 被 sele part 而又不是 vol 的分区该咋整.
一般情况下,如果 不能被 sele part 的分区,通常都是 已经被 * 了的,估计 detail part 能直接获取到,但是如果这时候 detail part 前 sele part 了,就可能因为  sele part 失败而导致脚本 中断. 所以 我说 要用  type 把脚本 传递给  diskpart .而不是用  diskpart /s .
diskpart 大部分命令都有 考虑脚本中使用而 增加 noerr 的参数,但,唯独 select 命令没有 noerr 参数.
估计是 考虑到 任何操作前都必须 select 一个焦点,但是 他没考虑过 遇到 这种天生被  * 了而又不能 select 的分区.





回复

使用道具 举报

22#
发表于 2018-6-27 14:42:09 | 显示全部楼层
nttwqz 发表于 2018-6-27 14:16
DISKPART> list disk

  磁盘 ###  状态           大小     可用     Dyn  Gpt

diskpart 的这个 “是否隐藏”  的信息 真让人 糊涂。
detail disk 也弄不出来 某个分区的具体信息啊,卷 和 分区 的对应关系 又要自己 计算才能获得。
回复

使用道具 举报

23#
发表于 2018-6-28 00:25:02 | 显示全部楼层
nttwqz 发表于 2018-6-27 15:31
话说,分区大小和偏移量数字和空格单位是不是最长7位?我准备预留8位,目前看绰绰有余了。

单位 2个字符
数字 4个字符 最大9999 再大就换 单位 了。所以紧凑一点儿 6位就够了
回复

使用道具 举报

24#
发表于 2019-3-21 22:42:30 | 显示全部楼层
刚 研究了下 win10 带的 powershell
那里面有两个指令 get-disk 和 get-partition 很是有用,单从获取硬盘分区序列来说,确实强大。

只是 pe 下弄 powershell 需要 .net 支持,而且对分区操作上,还有待加强。
powershell 是趋势,但现在还没成为主流,pe 上还没有,但 LTSC2019 中已经能看出微软这方面的想法,资源管理器中 没有了 cmd 的接口而是用了 powershell 而 ltsb2016中还有 cmd 的。
回复

使用道具 举报

25#
发表于 2019-3-23 07:12:07 | 显示全部楼层
freesoft00 发表于 2019-3-22 20:43
ps出来的时间也有很多了。
但是对我个人来说,会点cmd就不想学习ps了,因为参数语法太长了,记不住。

powershell 因为依托 .net 和 com 有 太多功能 ,学不全,而且殊途同归的方法也多,感觉像是在学 一门自然语言。
我也只是 知道 用 object 存储数据。
回复

使用道具 举报

26#
发表于 2019-4-11 14:20:21 | 显示全部楼层
nttwqz 发表于 2019-4-10 23:59
本版对列表生成核心部分改动稍多,可能会影响列表的正确生成,虽然暂时未发现异常,测试条件有限!

已在 ...

看着不错

那个diskpart 自动加 *  的 part 的问题,我这里没有测试环境了,一个盘这样,后来被我用 diskpart 重新分区了一次就没了。记得好像是 虽然不能 sele part 但是 detail part 还是可以用的,记不清了。

我正考虑 把 所有 vol 都 sele vol /detai part 一遍, sele part 和 sele vol 两套方案全用一遍,在一次 diskpart 过程中,然后再找出重叠和 新增的信息。这样可能会更稳妥,但是 可能会耗费半秒。
回复

使用道具 举报

27#
发表于 2022-8-31 22:40:07 | 显示全部楼层
对于 diskpart bug ,确定 分区 与 卷 对应关系上,
能否考虑 通过下面命令, 获取 字节偏移
  1. select vol 卷号
  2. detail part
复制代码

,配合 下面命令 ,来精准找出 对应关系?
  1. sele disk 盘号
  2. select part 分区号
  3. detail part
复制代码



回复

使用道具 举报

28#
发表于 2022-9-1 13:06:17 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-9-1 13:22 编辑
nttwqz 发表于 2022-9-1 01:49
看了下之前的回复,上次研究此bug已经是差不多一年半以前的事情了,我也记不太清除当初为何才用了这种信 ...

搞了一个 通过 分区 字节偏移量 来定位 分区 与 卷 对应关系的 脚本。不知道 能不能规避 一些bug .
parts6.7z (1.98 KB, 下载次数: 2)



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-20 03:12

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表