无忧启动论坛

标题: 开源了,一套基于gdisk的UD三分区一键制作cmd终结版,拿去编程吧! [打印本页]

作者: zds1210    时间: 2016-8-5 11:25
标题: 开源了,一套基于gdisk的UD三分区一键制作cmd终结版,拿去编程吧!
本帖最后由 zds1210 于 2016-8-16 00:43 编辑

警告:本脚本采用了多方软件,配合上的原因,有可能误伤到硬盘和U盘数据区,请小心操作。
可能问题:
1因gdisk磁盘编号方式比较另类,三个软件配合上,可能会误伤到硬盘。
2bootice切换数据区与efi区,有可能会失败,导致U盘数据区被清空。
测试PE:以下网址的手工文件夹中,下载iso和fba,改名替换winpe目录下的相应文件。 http://pan.baidu.com/s/1o6hXk1O

UD三分区U盘启动一键制作很火。原来已经推出一套基于分区助手命令行的脚本,这次推出基于gdisk的cmd脚本。有兴趣的拿去编程吧。
主要工具:gdisk+fbinst+bootice+7z
原理和主要改进:
UD三分区=左端UD区+中间ntfs格式激活的数据区data+右端的fat16隐藏的efi区
以前基于分区工具gdisk的命令行,要根据U盘大小和UD区和efi区大小,反算出数据区大小。这次在群友和之帮助下,成功改进,自定义UD区和EFI区大小,剩下的就是数据区大小,很人性化啊。
gdisk分区支持从U盘未分配空间的左端 或右端创建指定大小的分区,如果不指定分区大小占据全部空间;而不支持偏移位置创建分区。如果先建立UD区,gdisk认为是左端未分配空间,再创建空间就破坏UD区。所以,从U+后UD法是比较合理的。有群友方案是:先创制右端指定大小的efi区,然后再创制指定大小的数据区,左端剩下的未分配空间用fbinst非强格就成UD区。但这方案要反算 出数据data区,很不人性。
本法,先把U盘分区全部删除,从右端创建指定大小的efi区;然后再创建指定的大小的空间给UD区(不格式化,只是占据UD区的空间),然后不指定大小创建数据区data(中间剩下的就是数据区);
把左端的占位分区删除,然后用fbinst脚本不指定UD扩展分区大小非强格式化一次,左端的未分区空间就变成了UD区。
这个时候,你可以发现efi区是可见的,用7z命令行把efi.iso文件解压进efi区;然后用bootice切换为data区可见。
然后把UD.fba用fbinst写入UD区。
编程制作要点:
1关于防止误伤硬盘的问题:
gdisk磁盘编号和分区编号,从1开始,如 1 2 3 4 5……;而bootice和fbinst的磁盘编号和分区编号都是从o开始,如 0 1 2 3 4 5……
在本脚本中,是用fbinst plus脚本列取并获得U盘编号(为安全不列硬盘),gdisk的U盘编号应该是在这个基本上加1。但考虑到各种复杂情况,理论上有仍可能误伤硬盘。
实际编程中,编程应该用gdisk列有所有硬盘分区编号,然后和fbinstU盘编号加1作对比排除,这样子就可以万无一失,不会误伤到硬盘。
cmd脚本太弱,就不智能处理了。
2U盘左端的未分配空间,只指定UD主分区大小,不指定扩展分区大小,用fbinst非强格一次,就可以无损数据区和efi区格式化为UD区。这个发现我在无损制作中已经提及。
3bootice切换来切换去,到底哪个是efi区和data区。这次发现有一个分区表顺序强制按物理分区顺序排序的脚本,解决了这个问题。
但是无损升级PE时候,bootice切换efi区可见,理论上有可能失败,编程者还是要想办法判断清楚切换后可见区是否一定是efi区 ,以免误清空U盘数据区数据。
4制作U盘启动,U盘占用始终是一个问题。貌似chkdsk  g:  /x 下可以解决一点,不清楚效果大不大。
制作界面:





今天就写到这,以后有时间慢慢优化脚本,详细说清楚制作流程。下了,电脑研究多了,老婆在骂。
为方便非会员用户使用,附上cmd源码:
1全新制作UD三分区脚本
  1. <p>@echo off
  2. COLOR 2F
  3. rem 基于fbinst+gdisk+bootice的UD三分区制作脚本
  4. rem 如果计算机仅安装1块固定磁盘和一个U盘,则finst和bootice的U盘编号为1,gdiskU盘编号为2
  5. rem 本批处理旨在剖释 U盘UD三区 制作的原理,让普通用户也可以自主的进行U盘UD三区部署。
  6. rem 注意:全新制作时,U盘上所有数据将会全部丢失!!!
  7. echo.
  8. echo 基于fbinst+gdisk+bootice的UD三分区制作脚本</p><p>
  9. rem 变量说明: %uid%—用于fbinst和bootice的U盘磁盘编号  %uidg%—用于gdisk的U盘磁盘编号  %udri%—U盘盘符
  10. rem 中间文件说明 .\bin\uds.txt-U盘磁盘编号查看文件,用于判断U盘磁盘编号和盘符 </p><p>
  11. echo.
  12. echo  列出指定电脑上所有U盘
  13. .\bin\fbinst --hdlist "" --USB --REMOVABLE
  14. .\bin\fbinst --hdlist "" --USB --REMOVABLE >.\bin\uds.txt

  15. Echo.
  16. echo 智能查找U盘磁盘编号,多个U盘时候选择最后一个。
  17. Set uid=&&Set uidg=
  18. for %%j in (1 2 3 4 5 6 7 8 9 10 11 12) DO (find  /i "hd%%j" .\bin\uds.txt>nul&&SET uid=%%j)
  19. if not defined uid echo 找不到U盘,无法制作自动退出!!!!&&pause&&del .\bin\uds.txt /q&&goto EX
  20. echo 你的U盘磁盘编号为%uid%
  21. if %uid%==1 set uidg=2
  22. if %uid%==2 set uidg=3
  23. if %uid%==3 set uidg=4
  24. if %uid%==4 set uidg=5
  25. if %uid%==5 set uidg=6
  26. if %uid%==6 set uidg=7
  27. echo.
  28. echo 你的U盘安全分区的磁盘编号为%uidg%(一般为上面的磁盘编号加1,搞错会误操作到硬盘!)
  29. echo 再次核对你的U盘安全分区的磁盘编号与下列信息是否一致,不一致会误操作到硬盘。
  30. .\bin\gdisk32.exe /STATUS
  31. rem 以下语句用gdisk列出所有硬盘磁盘编号,编程者应该提取所有编号,排除 %uidg%=硬盘编号 的情况,以免误伤硬盘
  32. rem .\bin\gdisk32.exe /STATUS /nousb

  33. :U盘盘符不能用于gdisk命令行,主要用于复制文件到U盘efi区
  34. Echo.
  35. echo 智能查找U盘所在盘符
  36. Set udri=
  37. for %%i in (C  D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (find  /i "%%i:" .\bin\uds.txt>nul&&SET udri=%%i)
  38. if not defined udri echo 找不到U盘盘符,无法制作自动退出&&pause&&del .\bin\uds.txt /q&&goto EX
  39. echo 你的U盘所在盘符为%udri%盘(注意搞错会误操作到硬盘!)
  40. del .\bin\uds.txt /q

  41. :还原U盘上的空间,以免U盘二次制作失败!
  42. Echo.
  43. echo  还原U盘为普通U盘,增加制作的可靠性,所有U盘数据丢失,请备份U盘数据!!!
  44. pause
  45. echo on
  46. .\bin\fbinst.exe (hd%uid%) format --force --raw --fat32  --align
  47. @echo off

  48. echo.
  49. echo 删除U盘上的所有分区
  50. .\bin\gdisk32.exe %uidg% /del /all /y

  51. :创建380M的U+高端隐藏区,并设置卷标为efi
  52. echo.
  53. echo 创建380M的高端efi区
  54. .\bin\gdisk32.exe %uidg% /cre /pri /sz:380 /for /q /v:EFI /NTFAT16 /END  /y

  55. :创建500M的左端分区,占位用于UD区
  56. echo.
  57. echo 创建500M的UD区</p><p>rem .\bin\gdisk32.exe 2 /cre /pri /sz:500 /y
  58. .\bin\gdisk32.exe %uidg% /cre /pri /sz:500 /y

  59. :创建数据区
  60. echo.
  61. echo 创建数据区
  62. .\bin\gdisk32.exe %uidg% /cre /pri /for /NTFS /q /v:data  /y

  63. :删除UD分区,注意gdisk的磁盘分区编号为1 2 3 4 5……
  64. .\bin\gdisk32.exe  %uidg% /del /p:1  /y

  65. :格式化UD分区,注意左端的未分配空间用fbinst非强格就可以变成UD区,故UD扩展分区不要指定
  66. rem .\bin\fbinst.exe (hd%uid%)  format  --fat32 --zip --chs --primary 8M  --align
  67. .\bin\fbinst.exe (hd%uid%)  format  --fat32  --primary 8M  --align

  68. :激活data分区
  69. .\bin\gdisk32.exe %uidg% /act /p:1

  70. echo.
  71. echo UD三分区已经成功建立!

  72. :因这个时候efi区是可见的,用7z解压iso复制到EFI区
  73. echo.
  74. echo 正在把efi.iso文件写入EFI区,请稍候……
  75. .\bin\7z.exe x .\winpe\efi.iso -y -aos -o"%udri%:"
  76. if exist %udri%:\[boot] rd %udri%:\[boot] /s /q


  77. :分区表项按物理顺序排序,从而切换data为可见区
  78. .\bin\bootice.exe /DEVICE=%uid% /partitions /firstpart=0

  79. echo.
  80. echo  正在把ud.fba写入UD区,请稍候……
  81. .\bin\fbinst.exe (hd%uid%) load .\winpe\ud.fba

  82. echo.
  83. echo UD三分区PE部署成功!用佛大的qemu虚拟机测试一下bios/uefi双启吧!
  84. pause</p><p>
  85. goto ex

  86. :EX
  87. @echo on</p></p>
复制代码

2免格升级PE
  1. @echo off
  2. COLOR 2F
  3. rem 免格升级时候,不会破坏你U盘原有数据区的文件,只更新UD区和efi区文件。
  4. rem 免格升级时候,主要用于fbinst bootice和7z命令行

  5. echo.
  6. echo 免格升级UD三分区脚本!

  7. rem 变量说明: %uid%—用于fbinst和bootice的U盘磁盘编号  %udri%—U盘盘符
  8. rem 中间文件说明 .\bin\uds.txt-U盘磁盘编号查看文件,用于判断U盘磁盘编号和盘符



  9. echo.
  10. echo  列出指定电脑上所有U盘
  11. .\bin\fbinst --hdlist "" --USB --REMOVABLE
  12. rem del .\bin\uds.txt /q >nul
  13. .\bin\fbinst --hdlist "" --USB --REMOVABLE >.\bin\uds.txt

  14. Echo.
  15. echo 智能查找U盘磁盘编号,多个U盘时候选择最后一个。
  16. Set uid=
  17. for %%j in (1 2 3 4 5 6 7 8 9 10 11 12) DO (find  /i "hd%%j" .\bin\uds.txt>nul&&SET uid=%%j)
  18. echo 你的U盘磁盘编号为%uid%

  19. Echo.
  20. echo 智能查找U盘所在盘符
  21. Set udri=
  22. for %%i in (C  D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (find  /i "%%i:" .\bin\uds.txt>nul&&SET udri=%%i)
  23. if not defined udri echo 找不到U盘盘符,无法制作自动退出&&pause&&del .\bin\uds.txt /q&&goto EX
  24. echo 你的U盘所在盘符为%udri%盘(注意搞错会误操作到硬盘!)
  25. del .\bin\uds.txt /q
  26. pause

  27. :分区表项按物理顺序排序,从而强制切换data为可见区,以防切换分区出错
  28. .\bin\bootice.exe /DEVICE=%uid% /partitions /firstpart=0

  29. :切换efi区为可见区,这里efi区分区代码为2,实际情况要用bootice查看下
  30. .\bin\bootice.exe /DEVICE=%uid% /partitions /firstpart=2

  31. Echo.
  32. echo 正在清空UD区,并把新的UD.fba文件写入UD区,请稍候……
  33. .\bin\fbinst.exe (hd%uid%) clear
  34. .\bin\fbinst.exe (hd%uid%) load .\winpe\ud.fba

  35. :因这个时候efi区是可见的,用7z解压iso复制到EFI区
  36. :编程者要考虑切换efi区失败的问题,最好判断一下有没有efi目录,有就是efi区
  37. echo.
  38. echo 正在清空efi区,并把新的efi.iso文件写入EFI区,请稍候……
  39. echo 确认%udri%盘是EFI区,如果是数据区请退出,以免误删除U盘数据!
  40. pause
  41. del %udri%:*.* /f /a /q
  42. rd %udri%: /s /q
  43. .\bin\7z.exe x .\winpe\efi.iso -y -aos -o"%udri%:"
  44. if exist %udri%:\[boot] rd %udri%:\[boot] /s /q

  45. echo.
  46. echo 切换data区为可见!
  47. :分区表项按物理顺序排序,从而切换data为可见区
  48. .\bin\bootice.exe /DEVICE=%uid% /partitions /firstpart=0

  49. echo.
  50. echo 已经成功免格升级UD三分区PE!用佛大的qemu虚拟机测试一下bios/uefi双启吧!
  51. pause

  52. goto ex

  53. :EX
  54. @echo on
复制代码


3还原U盘
  1. @echo off
  2. COLOR 2F
  3. rem 还有UD三分区启动U盘到普通盘。所有U盘数据丢失!

  4. echo.
  5. echo 还有UD三分区启动U盘到普通盘脚本!

  6. rem 变量说明: %uid%—用于fbinst和bootice的U盘磁盘编号   %udri%—U盘盘符
  7. rem 中间文件说明 .\bin\uds.txt-U盘磁盘编号查看文件,用于判断U盘磁盘编号和盘符

  8. echo.
  9. echo  列出指定电脑上所有U盘
  10. .\bin\fbinst --hdlist "" --USB --REMOVABLE
  11. .\bin\fbinst --hdlist "" --USB --REMOVABLE >.\bin\uds.txt

  12. Echo.
  13. echo 智能查找U盘磁盘编号,多个U盘时候选择最后一个。
  14. Set uid=&&Set uidg=
  15. for %%j in (1 2 3 4 5 6 7 8 9 10 11 12) DO (find  /i "hd%%j" .\bin\uds.txt>nul&&SET uid=%%j)
  16. echo 你的U盘磁盘编号为%uid%


  17. :U盘盘符不能用于gdisk命令行,主要用于复制文件到U盘efi区
  18. Echo.
  19. echo 智能查找U盘所在盘符
  20. Set udri=
  21. for %%i in (C  D E F G H I J K L M N O P Q R S T U V W X Y Z) DO (find  /i "%%i:" .\bin\uds.txt>nul&&SET udri=%%i)
  22. if not defined udri echo 找不到U盘盘符,无法制作自动退出&&pause&&del .\bin\uds.txt /q&&goto EX
  23. echo 你的U盘所在盘符为%udri%盘(注意搞错会误操作到硬盘!)
  24. del .\bin\uds.txt /q

  25. rem 强制卸载并查看磁盘错误,解决U盘占用,以增强全新还原U盘的可靠性
  26. echo.&&echo 强制卸载并查看磁盘错误,以增强全新还原U盘的可靠性&&chkdsk %udri%: /x
  27. Echo.
  28. echo  还原U盘为普通U盘,增加制作的可靠性,所有U盘数据丢失,请备份U盘数据!!!
  29. pause
  30. echo on
  31. .\bin\fbinst.exe (hd%uid%) format --force --raw --fat32  --align
  32. @echo off

  33. goto ex

  34. :EX
  35. @echo on
复制代码

基于gdisk的UD三分区制作脚本3f5版 .7z

2.16 MB, 下载次数: 316, 下载积分: 无忧币 -2

手工提醒防误伤硬盘终结版


作者: zds1210    时间: 2016-8-5 13:01
警告:本脚本采用了多方软件,配合上的原因,有可能误伤到硬盘和U盘数据区,请小心操作。目前仍为测试版。
作者: ferdfg    时间: 2016-8-5 19:32
就冲着这好人品也要支持楼主继续开发
作者: devilma    时间: 2016-8-5 21:50
谢谢,你总是走在前面!!

作者: devilma    时间: 2016-8-5 21:50
谢谢,你总是走在前面!!

作者: zds1210    时间: 2016-8-5 21:52
devilma 发表于 2016-8-5 21:50
谢谢,你总是走在前面!!

gdisk法的三分区早有人用了。只是人家保密。我得到资料后,改进后,与大家共享。
作者: 红毛樱木    时间: 2016-8-6 02:39
gdisk不是一般人玩的,小心,小心
作者: zds1210    时间: 2016-8-6 09:33
红毛樱木 发表于 2016-8-6 02:39
gdisk不是一般人玩的,小心,小心

确实如此。
作者: zds1210    时间: 2016-8-6 09:34
还是分区助手命令行简单安全。
作者: 527104427    时间: 2016-8-6 10:55
能做个图形化界面就更好了

作者: zds1210    时间: 2016-8-6 11:20
527104427 发表于 2016-8-6 10:55
能做个图形化界面就更好了

核心代码已经搞定,我这是供大家做成图形界面的,au3,其它语言很容易制作出来。
作者: 2011npwjm    时间: 2016-8-6 11:53
谢谢楼主的分享
作者: zds1210    时间: 2016-8-6 21:27
实测没有多大问题,本脚本就此终结。
作者: fuldho    时间: 2016-8-7 05:39
玩了一段时间了,应该没什么问题。
http://bbs.wuyou.net/forum.php?m ... d=374541&extra=
作者: zds1210    时间: 2016-8-7 10:42
fuldho 发表于 2016-8-7 05:39
玩了一段时间了,应该没什么问题。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=374541&extra=

好的,问下,大师的分区工具是gdisk吧?
作者: zds1210    时间: 2016-8-7 15:39
1关于防止误伤硬盘的问题:
gdisk磁盘编号和分区编号,从1开始,如 1 2 3 4 5……;而bootice和fbinst的磁盘编号和分区编号都是从o开始,如 0 1 2 3 4 5……
在本脚本中,是用fbinst plus脚本列取并获得U盘编号(为安全不列硬盘),gdisk的U盘编号应该是在这个基本上加1。但考虑到各种复杂情况,理论上有仍可能误伤硬盘。
实际编程中,编程应该用gdisk列有所有硬盘分区编号,然后和fbinstU盘编号加1作对比排除,这样子就可以万无一失,不会误伤到硬盘。
cmd脚本太弱,就不智能处理了。
2U盘左端的未分配空间,只指定UD主分区大小,不指定扩展分区大小,用fbinst非强格一次,就可以无损数据区和efi区格式化为UD区。这个发现我在无损制作中已经提及。
3bootice切换来切换去,到底哪个是efi区和data区。这次发现有一个分区表顺序强制按物理分区顺序排序的脚本,解决了这个问题。
但是无损升级PE时候,bootice切换efi区可见,理论上有可能失败,编程者还是要想办法判断清楚切换后可见区是否一定是efi区 ,以免误清空U盘数据区数据。
作者: 2011阿星    时间: 2016-8-7 15:48
fbinst不支持windows10x64吗,试了2U盘,都无法找到?
作者: zds1210    时间: 2016-8-7 22:51
2011阿星 发表于 2016-8-7 15:48
fbinst不支持windows10x64吗,试了2U盘,都无法找到?

右击以管理员权限运行脚本。
作者: 2012eye    时间: 2016-8-10 12:34
谢谢谢谢谢谢谢谢 辛苦了
作者: fuldho    时间: 2016-8-10 20:43
zds1210 发表于 2016-8-7 10:42
好的,问下,大师的分区工具是gdisk吧?

是的!没错
作者: zds1210    时间: 2016-8-11 22:53
把cmd源码也帖出来了。
作者: sglclm    时间: 2016-8-13 14:19
非常感谢楼主的分享
作者: zds1210    时间: 2016-8-19 23:04
多多分享是良方。
作者: zds1210    时间: 2016-8-21 22:45
希望同志们关注下。
作者: lbw2007    时间: 2016-8-21 22:52
感谢分享!好好学习一下!
作者: 2010dtf    时间: 2016-11-29 20:00
一直没人做成可执行文件???
作者: chenlin189    时间: 2016-11-30 08:39
谢谢分享,你的辛苦给我们带了方便,向您致敬
作者: zds1210    时间: 2016-12-1 12:46
红毛樱木 发表于 2016-8-6 02:39
gdisk不是一般人玩的,小心,小心

但编程时候小心点,排除到操作硬盘的情况,安全还是有保证的。
作者: daier    时间: 2016-12-2 14:25
谢谢分享
作者: dkcheng2008    时间: 2016-12-9 21:44
谢谢分享!
作者: zds1210    时间: 2018-10-18 23:59
基于gdisk的三分区脚本,开源在这里。




欢迎光临 无忧启动论坛 (http://wuyou.net./) Powered by Discuz! X3.3