找回密码
 加入
搜索
查看: 7535|回复: 33

[AU3基础] [已解决]可否判断C盘是活动分区并执行程序?感谢austere 帮助

  [复制链接]
发表于 2017-1-5 19:00:59 | 显示全部楼层 |阅读模式
本帖最后由 令狐大虾 于 2017-1-8 22:05 编辑

在UEFI PE启动模式下释放WIM到C盘后运行bcdboot c:\windows /l zh-cn 后。
1.对于存在ESP隐藏区的GPT磁盘会将启动文件夹EFI写入ESP活动区。
2.但是对于UEFI启动的MBR磁盘必须
运行bcdboot c:\windows /l zh-cn /s c: 才能将启动文件夹EFI写入活动区C盘。
同样在GPT模式磁盘运行bcdboot c:\windows /l zh-cn /s c: 也会将启动文件夹EFI写入活动区C盘,只是安装时候出错不能启动。
3.两行命令在UEFI PE启动下同时执行适用与MBR和GPT模式磁盘。但对于GPT模式磁盘就显得多余。

论坛里面搜索,只是判断当前系统是否是UEFI启动而已。经过思考,GPR模式C盘不是活动区而MBR模式却是。所以判断C盘是否活动区而写入相应命令最准确。特别是对于多硬盘并且是混合模式硬盘下。
发表于 2017-1-5 20:12:59 | 显示全部楼层
GPT分区需要一个单独的16或者32的fat分区来保存UEFI的启动信息,请问这个分区的盘符你怎么判断?至于往分区内写uefi信息就简单了 bcdboot命令就可以搞定
另:uefi除了GPT分区适合,MBR分区用uefi我个人感觉就是个鸡肋,一点用都没有。。。
 楼主| 发表于 2017-1-5 21:17:08 | 显示全部楼层
回复 2# austere

请看标题,我请教的是判断C盘是否是活动区。
还有,我并不觉得MBR是鸡肋。它可以用混合模式启动(MBR模式启动或是UEFI模式启动)。在帮客户安装系统的时候根本就不需要转换磁盘模式也可以UEFI启动。
发表于 2017-1-5 22:58:06 | 显示全部楼层
回复 3# 令狐大虾


    你的意思是MBR模式下,ghost恢复系统后用bcdboot修复uefi引导来实现不转换磁盘模式来uefi引导?
这种法我没实践过。。。
 楼主| 发表于 2017-1-6 12:53:33 | 显示全部楼层
本帖最后由 令狐大虾 于 2017-1-6 17:41 编辑

回复 4# austere

不是GHOST恢复,是PE下释放WIM文件到C盘后再写入引导文件。当然你GHOST释放也可以。
此法不需要转换原来的MBR磁盘模式就可以UEFI引导启动,当然,玩这个方法的人不多。毕竟大多数人都是按照微软的方法折腾。
因为我是用自写的安装器安装,在UEFI PE下启动,对于MBR模式的磁盘磁盘用bcdboot c:\windows /l zh-cn /s c: 写入启动引导文件到活动区C盘(此命令在GPT下也会强制写入C盘),而对于GPT模式的磁盘用bcdboot c:\windows /l zh-cn 写入启动文件到活动区ESP。
所以我想判断C盘是不是活动区而执行命令。
发表于 2017-1-6 17:05:04 | 显示全部楼层
回复 5# 令狐大虾


    你那个判断C盘是不是活动分区那个我不会整,但是能给你一个方法判断硬盘是MBR模式还是GPT模式,目的能实现你的那个要求,MBR这个就不管了,默认你已经写了引导,如果是GPT模式的话,再把引导文件重新复制到引导分区
判断方法:用diskpart命令
开始--运行--输入 diskpart    然后输入 list disk   根据返回的信息来判断是否是GPT模式,如果是GPT模式则GPT显示下面会有*号   如果没有*号则为MBR模式
程序实现方法,C盘下新建一个文本文档 输入list disk 保存为 123.txt
用命令 diskpart c:\123.txt > c:\234.txt
然后获取234.txt里面的数组 进行判断
发表于 2017-1-6 17:12:30 | 显示全部楼层
针对多硬盘 list disk也会显示出其他硬盘,如果要进行判断的话,以磁盘 0为准,如果系统C盘是启动盘,怎么磁盘肯定为 磁盘0  根据这个来进行判断就好了
 楼主| 发表于 2017-1-6 17:47:48 | 显示全部楼层
本帖最后由 令狐大虾 于 2017-1-6 17:53 编辑

回复 6# austere

你这个方法只是适合单硬盘。对于混合磁盘就是多硬盘不同模式就好比盲选一样。
 楼主| 发表于 2017-1-6 17:48:31 | 显示全部楼层
本帖最后由 令狐大虾 于 2017-1-6 17:51 编辑
针对多硬盘 list disk也会显示出其他硬盘,如果要进行判断的话,以磁盘 0为准,如果系统C盘是启动盘,怎么磁 ...
austere 发表于 2017-1-6 17:12


磁盘0或1以下类推受SATA插口左右。而且是在PE下执行判断啊,先决系统是PE决定是磁盘0还是1
发表于 2017-1-6 20:25:57 | 显示全部楼层
PE下你系统确定是安装到C? 前面已经说了C肯定是 disk 0    具体你PE下测试一下,我用的Pe都是这样
发表于 2017-1-6 20:44:22 | 显示全部楼层
另外还可以用一个命令  diskpart然后输入list vol
这个会获取所有硬盘的分区信息。 然后根据回显内容看C盘 最后一栏信息中的信息。如果显示为系统则为mbr 其他的则为uefi
 楼主| 发表于 2017-1-6 21:01:51 | 显示全部楼层
回复 10# austere

嗯,当然是安装到C盘,AU3例子麻烦写个给我。判断C盘所在的磁盘为MBR就执行程序即可
发表于 2017-1-6 22:10:24 | 显示全部楼层
回复 12# 令狐大虾
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <File.au3>
#include <Process.au3>

If FileExists(@TempDir & "\disk") = 0 Then _FileCreate(@TempDir & "\disk")
$file = _FileCreate(@TempDir & "\disk\list.txt")
        $file1 = FileOpen($file, 1)
        FileWrite(@TempDir & "\disk\list.txt", "list vol")

        _RunDos("cmd.exe /c diskpart.exe /s " & @TempDir & "\disk\list.txt >"& @TempDir & "\disk\123.txt")
        Local $aArray = FileReadToArray(@TempDir & "\disk\123.txt")
        Local $asd = _ArrayFindAll($aArray, "  C  ", Default, Default, 1, 1, 2)
                $ss = StringStripWS($aArray[$asd[0]], 8)
        Local $sss = StringRight($ss, 2)
        If $sss == "启动" Then
                MsgBox(0,"","当前为UEFI启动")
        Else
                msgbox(0,"","当前为MBR启动")
        EndIf
        
发表于 2017-1-6 22:23:53 | 显示全部楼层
看看这个合适:
$objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
$colItems = $objWMIService.ExecQuery("Select * from Win32_DiskPartition")
Dim $objItem
For $objItem In $colItems
        MsgBox(0, "主分区和扩展分区","磁盘索引: " & $objItem.DiskIndex & @CRLF & "分区索引: " & $objItem.Index & @CRLF & "主分区: " & $objItem.PrimaryPartition & @CRLF & "引导分区: " & $objItem.BootPartition & @CRLF & "可启动: " & $objItem.Bootable & @CRLF & "大小: " & $objItem.Size)
Next
发表于 2017-1-6 22:30:03 | 显示全部楼层
回复 13# austere


    给你参考虫子樱桃的代码:
#include <WinAPI.au3>
Global Const $ERROR_INVALID_FUNCTION=0x1
DllCall("Kernel32.dll", "dword", "GetFirmwareEnvironmentVariableW", "wstr", "", "wstr", '{00000000-0000-0000-0000-000000000000}', "wstr", Null, "dword", 0)
If _WinAPI_GetLastError() = $ERROR_INVALID_FUNCTION Then
    MsgBox(0,'','Legacy BIOS')
Else
    MsgBox(0,'','UEFI Boot Mode')
EndIf
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-25 22:52 , Processed in 0.082811 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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