刷新DNS解析

ipconfig /flushdns

查看磁盘分区

#进入 diskpart
diskpart
list disk //列出所有挂在磁盘
sel disk X //选中刚刚自己发现的系统所在磁盘(X自己替换成数字)
lis​​​​​​​t vol​​​​​​​ //查看磁盘里各个盘符,并确定自己的win系统所在的盘符(通常为C盘)
list par //列出上一步所选磁盘的分区,其中就有存放efi的分区,类型为系统,大小几百M
sel par x  //选择efi的分区,x为分区编号
assign letter=o  //为选择的分区分配一个盘符为o以便修复
remove letter=H  #移除分区盘符,H为分区盘符合
exit //退出diskpart,不要关闭命令行框

bcdboot命令修复系统引导

bcdboot x:\windows /s o: /f uefi /l zh-cn  //其中x为确定的window系统盘盘符。
#盘符x:是你自己刚刚确定的盘符,最后的/l是小写的L,不是1

会提示“已成功创建启动文件”。
注意:有的电脑会显示“尝试复制启动文件失败”,如果以上输入没有问题,那么问题在于你的x盘不对,或者说再这个命令行里符号x不代表它。如果显示“尝试复制启动文件失败”,输入exit退出diskpart并使用dir命令判断那个是系统盘。
然后输入exit退出命令行,关机重能进入弄丢的Windows了。

diskpart #运行diskpart工具 隐藏 EFI 分区的方法
有时候系统的EFI分区也显示在资源管理器中,双击提示不能进去,区分大小一般是300M,这就是系统启动分区EFI分区,一般情况下是看不见的,如果你能看见说明系统经过了某些操作才会如此,现在可以按以下操作,不让这个系统分区展示出来。

打开cmd或powershell,按如下命令行操作(以powershell示例,#及后面文字为注释内容不需要输入):

diskpart  #运行diskpart工具
lis dis  #列出所有磁盘
sel dis 2  #选中u盘,视你的磁盘大小判断选择数字,2是我的u盘
lis par  #列出所有分区
sel par 2  #选中efi分区,视你的分区大小判断选择,2是我的efi分区
detail par  #查看该分区详细信息

#如果在磁盘管理器中看不到可以显示出来的
#set id=06  #取消分区隐藏,如果是1b或1c就改成0b或0c,执行该命令后磁盘管理中就能看到efi盘符了

#这里在LTR一列可以看到分配的盘符,我这里是H,区分大小写的
remove letter=H  #移除分区盘符,视你的efi分区盘符选择

#设置回隐藏的
#set id=16  #分区类型改回隐藏

1705558696616.jpg

EFI分区文件结构(仅说明3个必要文件)

(EFI分区)..................此分区必须为Fat32格式,不然UEFI固件将无法识别
|
+--EFI
  |--Microsoft
  |  +--Boot
  |     |--bootmgfw.efi...一个针对Windows的efi应用,使Boot Menu界面上的Windows Boot Manager可以工作
  |     +--BCD............启动配置文件,用户编辑启动菜单以及默认的启动顺序等
  |--Boot
      +--bootx64.efi.......一个针对UEFI的统一efi应用,可以针对所有的系统。如果是32位系统,则是boota32.ef

引导流程

                                     计算机加电
                                        |
                                      BIOS自检
                                        |
                                    UEFI固件启动
                                        |
                        根据NVRAM下的BootOrder顺序加载启动设备
                                        |
              获取对应启动设备下第一个存有正确efi应用的Fat32格式分区并加载
                                        |
                            读取efi应用信息,加载到BCD文件
                                        |
读取BCD文件下的记录以加载系统,默认Windows10系统是加载C:\Windows\System32\winload.efi应用
                                        |
                  接下来就交给系统服务了。这样子就完成了系统的启动过程

说明一下:

什么叫做根据NVRAM下的BootOrder顺序加载启动设备,这个里面有几个知识点

NVRAM(非易失性存储器) 是BIOS用于存储本计算机启动设备信息的载体,可以通过 bcdedit /enum firmware 来查看信息,参考 这个

BootOrder 顾名思义就是一个引导顺序,可以在BIOS下调节,比如先引导Windows Boot Manager还是先引导ATA HDD0这个设备

什么叫做获取对应启动设备下第一个存有正确efi应用的Fat32格式分区并加载?正常情况来说,一个硬盘分区仅有一个Fat32格式的EFI分区,并且往往是在第一个,但是当出现多了EFI分区那么UEFI固件将如何加载呢?对于首选启动已经设置为了Windows Boot Manager的情况下可以忽略,因为这个里面已经明确定义了加载哪块硬盘的哪个分区下哪个文件。当没有这个Windows Boot Manager项目而只能通过ATA HDDX下的分区查找时,经测试。会加载上可识别的拥有正确efi应用(位置: (EFI_Partition)EFIBootbootx64.efi )的第一个EFI分区,并根据efi应用的信息加载对应的BCD文件。

So,总结如下。可以没有 (EFI_Partition)EFIBootbootx64.efi ,也可以没有: (EFI_Partition)EFIMicrosoftBootbootmgfw.efi ,但是不能2个同时没有,存在 (EFI_Partition)EFIBootbootx64.efi 的情况下,可以在BIOS的Boot Menu界面选择ATA HDDX启动,存在 (EFI_Partition)EFIMicrosoftBootbootmgfw.efi 并设置正确的情况下,可以在BIOS的Boot Menu界面上选择 Windows Boot Manager启动。

说几个关于引导的命令
mountvol 用于加载分区,比如 mountvol K: /s 加载默认的EFI分区到K盘

bcdboot 用于修复efi文件,比如 bcdboot C:Windows /l en-us 将同时修复 (EFI_Partition)EFIBootbootx64.efi 和 (EFI_Partition)EFIMicrosoftBootbootmgfw.efi 2个文件

bootrec 可用于重新创建BCD文件,比如 bootrec /rebulidbcd 会在默认的位置 (EFI_Partition)EFIMicrosoftBoot 重新生成识别到的系统的BCD文件

bcdedit 用于编辑BCD文件

如果安装了双系统,不小心把WIN系统的引导删除了怎么恢复:
需要有PE系统,没有可以自己制作一个,这里不展开了
进去PE系统后修复BCD,以U启通PE为例:进入安装界面,点击左下角修复计算机。依次点击:“疑难解答”,“高级选项”,“命令提示符”。进入CMD命令 接下来依次输入

diskpart
list disk //列出所有挂在磁盘
sel disk X //选中刚刚自己发现的系统所在磁盘(X自己替换成数字)
lis​​​​​​​t vol​​​​​​​ //查看磁盘里各个盘符,并确定自己的win系统所在的盘符(通常为C盘)
list par //列出上一步所选磁盘的分区,其中就有存放efi的分区,类型为系统,大小几百M
sel par x  //选择efi的分区,x为分区编号
assign letter=o  //为选择的分区分配一个盘符为o以便修复
exit //退出diskpart,不要关闭命令行框

4077bec5accc431db430a3659d709633.png
bcdboot命令进行修复
命令行使用bcdboot命令,大概但不是下面这样
这里的c:不一定是系统盘,需要用dir命令列出盘内文件来自己判断哪个才是系统盘,dir c: 和 dir d: 等,记住系统盘是哪个。
046ffeb9e06742c19fc4d95e938e4b33.png
然后执行bcdboot命令:
最后输入

bcdboot x:\windows /s o: /f uefi /l zh-cn  //其中x为亲自判断的系统盘盘符。
#盘符x:是你自己刚刚确定的盘符,最后的/l是小写的L,不是1

会提示“已成功创建启动文件”。

注意:有的电脑会显示“尝试复制启动文件失败”,如果以上输入没有问题,那么问题在于你的x盘不对,或者说再这个命令行里符号x不代表它。
如果显示“尝试复制启动文件失败”,输入exit退出diskpart并使用dir命令判断那个是系统盘。

然后输入exit退出命令行,关机重能进入弄丢的Windows了。

终于大功告成

小结
到目前为止是windows进去了但是我最初的目的还没达到阿,就是切换双系统。其实在这个折腾的过程中我已经解决了,下面来唠唠上面说的蠢的过程:
首先第一张图的系统选择页面是由ubuntu系统设置的开机引导页面供自己选择进入哪个系统,而我当时忘记了,所以就开始准备在windows系统里面准备设置开机引导来供选择进入哪个系统,最后没有成功还把windows搞得进不去了。原理上应该是可行了,两个系统之间的切换只需修改一个系统的开机引导选择就行了,而我已经在ubuntu里面设置了(具体设置可以参考这里),至于为什么没有开机的时候进入这个选择的页面是因为,BIOS里面把windows作为最先启动的了,所以以前开机直接就进windows了,没有出现选择的页面。当我把BIOS启动优先级改成了ubuntu最先启动,这时就会出现选择系统的页面了,然后选择就好了,就这么简单。

PHP易错点

<?php

//空格会被判断为真
var_dump(!!'0'); //false
var_dump(!!' '); //true,空格会被判断为真


        var updateStatus = true
        window.addEventListener('beforeunload', function (event) {
            // 取消关闭窗口事件
            if (!updateStatus) return true
            event.preventDefault();
            // Chrome 需要返回一个空字符串
            event.returnValue = '当前数据有更新还未保存,是否要离开?';
            return '当前数据有更新还未保存,是否要离开?'
        })