分享U盘EFIShell安装win8系统及脚本的应用

分享U盘EFIShell安装win8系统及脚本的应用

* 来源: * 作者: * 发表时间: 2021-01-15 6:17:49 * 浏览: 0

最近搞了个3T的硬盘, 如何把系统装到该硬盘就成了个问题。

光盘安装自然是没问题的, 但光盘的速度无法恭维, 最要命的是叔已经不用光驱N年了。

优盘安装网上教程很多, 但大多数号称必须要格个4G左右的FAT32才行, FAT32多老的技术啊,我看着就揪心。

怎么办? 能不能FAT32分区少一点, 其他的格成NTFS (或者认为NTF伤优盘的, EXFAT也行啊), 把主要安装文件放在 NTFS或者EXFAT分区上?

经过度娘的搜索, 借鉴各位先行者的探索, 我终于有了个比较满意的方案。


第一步, 先把优盘分成2个区,用那个DiskGenius分, 分好之后很纠结, 只能显示一个分区, 但后来发现真是妙, 另一个分区被无意隐藏了,好得很哪。

以32G优盘为例, 第一个分区分成31G左右, 余下100多MB格式化成FAT32, 其实FAT32 只要几MB就行, 如果想再放个PE,那么几百MB也行。
开始的时候要往FAT32放东西,系统只能显示第一个分区, 那么先把第一个分区删除了, 系统就能认出只有100多MB的FAT32分区了,等把EFI Shell的需要的文件拷贝到FAT32之后, 再恢复第一个分区,第二个分区就被隐藏了,真没想到还有这样的妙用!


网上有很多EFI Shell的下载, 一般这个压缩包根目录有个shell.efi的文件,还有个APPS的子目录,如果下载下来的文件有这样的结构, 那么恭喜你,下对了。

将这些文件拷贝到优盘FAT32的根目录,然后新建个efi\boot目录, 将shell.efi 移到 \efi\boot\, 然后改shell.efi 成 bootx64.efi, 这样就可以从优盘启动EFI Shell了。 至于为什么要这样做,我也不知道, 只知道缺少任何一步,优盘就无法启动EFI Shell。


第二步,让EFI识别NTFS分区,度娘告诉我,无忧驱动论坛的一个大神发现鬼佬有这么个驱动NTFS.EFI, 只要 load ntfs.efi 就行。我将这个文件拷贝到优盘根目录, 然后期望做个自动执行的脚本,将这句命令拷贝到startup.nsh里, 运行结果告诉我无法找到此文件。我再移到apps子目录, 以为很多命令都在这里,这里可能就是类似windows的system32目录,系统会自动找到,但依旧失望了。分析了运行过程, 发现原来映射的驱动器时时会改变, 一会儿FS0, 一会儿FS1,再来个BLK3之类的,真折腾人啊。 特别是运行了 map -r 之后,整个天翻地覆了, 驱动器到处乱跑,后来的事实证明 map命令根本不需要, 无论加什么参数。

第三步, 将我编制的startup.nsh拷贝到\efi\boot\下,ntfs.efi移到\apps下,(别的目录也行, 只是要修改脚本) 再将windows安装盘拷贝到第一个分区根目录,再多拷贝一个bootmgfw.efi (度娘或者windows安装目录里找)也到根目录, 这样就自动启动windows的安装程序了。

startup.nsh 源程序如下:

echo -off
if exist fs0:\apps tfs.efi then
set test "fs0:"
endif
if exist fs1:\apps tfs.efi then
set test "fs1:"
endif
if exist fs2:\apps tfs.efi then
set test "fs2:"
endif
if exist fs3:\apps tfs.efi then
set test "fs3:"
endif
if exist fs4:\apps tfs.efi then
set test "fs4:"
endif
if exist fs5:\apps tfs.efi then
set test "fs5:"
endif
if exist fs6:\apps tfs.efi then
set test "fs6:"
endif
if exist fs7:\apps tfs.efi then
set test "fs7:"
endif
if exist fs8:\apps tfs.efi then
set test "fs8:"
endif
if exist fs9:\apps tfs.efi then
set test "fs9:"
endif
if exist fsa:\apps tfs.efi then
set test "fsa:"
endif
if exist fsb:\apps tfs.efi then
set test "fsb:"
endif
load %test%\apps tfs.efi

if exist blk0:\bootmgfw.efi then
set test1 "blk0:"
endif
if exist blk1:\bootmgfw.efi then
set test1 "blk1:"
endif
if exist blk2:\bootmgfw.efi then
set test1 "blk2:"
endif
if exist blk3:\bootmgfw.efi then
set test1 "blk3:"
endif
if exist blk4:\bootmgfw.efi then
set test1 "blk4:"
endif
if exist blk5:\bootmgfw.efi then
set test1 "blk5:"
endif
if exist blk6:\bootmgfw.efi then
set test1 "blk6:"
endif
if exist blk7:\bootmgfw.efi then
set test1 "blk7:"
endif
if exist blk8:\bootmgfw.efi then
set test1 "blk8:"
endif
if exist blk9:\bootmgfw.efi then
set test1 "blk9:"
endif
if exist blka:\bootmgfw.efi then
set test1 "blka:"
endif
if exist blkb:\bootmgfw.efi then
set test1 "blkb:"
endif
%test1%\bootmgfw


为什么需要这么多的endif,我以为只要一个, 发现运行错误, 只能怪这个2b的shell脚本了。我本来还以为只要一个变量,只要重新赋值就行,后来证明我也错了, 所以不要怪我编这么繁琐的难看的脚本, 不是我的错。

本程序也只能应付大多数情况, 对于有好多硬盘,优盘,光盘的机器, 恐怕要修改下脚本了。因为脚本的编写只有这么几条简陋的命令, 没有dos里边 find for 之类的高级命令。 哦, 我错了, for命令也有, 只是...

2个疑问:

1. 本来按我的设想, 我在第一个分区建若干个子目录, 分别是win7, win8 之类的, 将安装盘分别拷入,然后只要执行类似 fsx:\win7\bootmgfw.efi 就能启动win7, fsx:\win8\bootmgfw.efi就能启动win8。 结果发现不行, \bcd 错误, 估计要改变 bcd 路径, 留待大家开发。懒惰的我还是这样布局的, 想换系统的时候直接将子目录的安装文件移到根目录,完了再移回去, 反正在一个分区, 移一下就2-3秒时间。

2. 启动efi shell, 有个1T的硬盘未分区,windows安装文件无法找到硬盘, 后来将它创建分区才可以(我随便创建了个MBR分区)。 当然我知道切换出去用diskpart可以创建分区,但不知道为什么会这样,这是个例还是所有未分区的都不能被EFI SHELL启动的windows安装程序识别? 留待大家验证, 并希望有人找到解决之道。


本文给大家提供个比较新颖的思路,希望大家加以完善。