zds1210 发表于 2016-8-5 11:25:56

开源了,一套基于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盘占用始终是一个问题。貌似chkdskg:/x 下可以解决一点,不清楚效果大不大。
制作界面:





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

Echo.
echo 智能查找U盘磁盘编号,多个U盘时候选择最后一个。
Set uid=&&Set uidg=
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)
if not defined uid echo 找不到U盘,无法制作自动退出!!!!&&pause&&del .\bin\uds.txt /q&&goto EX
echo 你的U盘磁盘编号为%uid%
if %uid%==1 set uidg=2
if %uid%==2 set uidg=3
if %uid%==3 set uidg=4
if %uid%==4 set uidg=5
if %uid%==5 set uidg=6
if %uid%==6 set uidg=7
echo.
echo 你的U盘安全分区的磁盘编号为%uidg%(一般为上面的磁盘编号加1,搞错会误操作到硬盘!)
echo 再次核对你的U盘安全分区的磁盘编号与下列信息是否一致,不一致会误操作到硬盘。
.\bin\gdisk32.exe /STATUS
rem 以下语句用gdisk列出所有硬盘磁盘编号,编程者应该提取所有编号,排除 %uidg%=硬盘编号 的情况,以免误伤硬盘
rem .\bin\gdisk32.exe /STATUS /nousb

:U盘盘符不能用于gdisk命令行,主要用于复制文件到U盘efi区
Echo.
echo 智能查找U盘所在盘符
Set udri=
for %%i in (CD 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)
if not defined udri echo 找不到U盘盘符,无法制作自动退出&&pause&&del .\bin\uds.txt /q&&goto EX
echo 你的U盘所在盘符为%udri%盘(注意搞错会误操作到硬盘!)
del .\bin\uds.txt /q

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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



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

Echo.
echo 智能查找U盘磁盘编号,多个U盘时候选择最后一个。
Set uid=
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)
echo 你的U盘磁盘编号为%uid%

Echo.
echo 智能查找U盘所在盘符
Set udri=
for %%i in (CD 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)
if not defined udri echo 找不到U盘盘符,无法制作自动退出&&pause&&del .\bin\uds.txt /q&&goto EX
echo 你的U盘所在盘符为%udri%盘(注意搞错会误操作到硬盘!)
del .\bin\uds.txt /q
pause

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

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

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

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

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

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

goto ex

:EX
@echo on

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

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

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

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

Echo.
echo 智能查找U盘磁盘编号,多个U盘时候选择最后一个。
Set uid=&&Set uidg=
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)
echo 你的U盘磁盘编号为%uid%


:U盘盘符不能用于gdisk命令行,主要用于复制文件到U盘efi区
Echo.
echo 智能查找U盘所在盘符
Set udri=
for %%i in (CD 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)
if not defined udri echo 找不到U盘盘符,无法制作自动退出&&pause&&del .\bin\uds.txt /q&&goto EX
echo 你的U盘所在盘符为%udri%盘(注意搞错会误操作到硬盘!)
del .\bin\uds.txt /q

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

goto ex

:EX
@echo on

zds1210 发表于 2016-8-5 13:01:23

警告:本脚本采用了多方软件,配合上的原因,有可能误伤到硬盘和U盘数据区,请小心操作。目前仍为测试版。

ferdfg 发表于 2016-8-5 19:32:00

就冲着这好人品也要支持楼主继续开发{:3_142:}

devilma 发表于 2016-8-5 21:50:20

谢谢,你总是走在前面!!

devilma 发表于 2016-8-5 21:50:26

谢谢,你总是走在前面!!

zds1210 发表于 2016-8-5 21:52:32

devilma 发表于 2016-8-5 21:50
谢谢,你总是走在前面!!

gdisk法的三分区早有人用了。只是人家保密。我得到资料后,改进后,与大家共享。

红毛樱木 发表于 2016-8-6 02:39:20

gdisk不是一般人玩的,小心,小心

zds1210 发表于 2016-8-6 09:33:16

红毛樱木 发表于 2016-8-6 02:39
gdisk不是一般人玩的,小心,小心

确实如此。

zds1210 发表于 2016-8-6 09:34:27

还是分区助手命令行简单安全。

527104427 发表于 2016-8-6 10:55:33

能做个图形化界面就更好了
{:2_123:}
页: [1] 2 3 4
查看完整版本: 开源了,一套基于gdisk的UD三分区一键制作cmd终结版,拿去编程吧!