找回密码
 加入
搜索
查看: 369|回复: 11

[系统综合] UEFI引导分区盘符提取源码

[复制链接]
发表于 2024-10-4 22:05:59 | 显示全部楼层 |阅读模式
本帖最后由 xztpc 于 2024-10-4 22:13 编辑

玩了一年的易语言,因为易语言不能编译64位程序,今年硬着头皮转战AU3,去年实际上就接触了,看着满屏的英文没敢涉足!现在玩了半个月了!稍微有点进步!现在主要是研究引导自动修复!来抛砖引玉,也希望能得到大家指点!
#include <File.au3>
tiquefi()
Func tiquefi()
        FileInstall("cx.exe", @ScriptDir & "\cx.exe")
        RunWait(@ComSpec & " /C " & @ScriptDir & "\cx.exe -mohong >" & @ScriptDir & "\Part.Txt", @ScriptDir, @SW_HIDE)
        $filePath = @ScriptDir & "\Part.Txt"
    $searchString = "EFI"
    If FileExists($filePath) Then
                $fileHandle = FileOpen($filePath, 0)
        Local $lineNumber = 0
        While 1
            $line = FileReadLine($fileHandle, $lineNumber)
            If @error = -1 Then ExitLoop
                        $lineNumber += 1
            Local $pos = StringInStr($line, $searchString)
            If $pos > 0 Then
                $EfiPanfu = StringRight(StringLeft($line, 5), 1)
                MsgBox(0, "找到引导分区", 'EFI分区盘符是:' & $EfiPanfu)
            EndIf
        WEnd
    EndIf
EndFunc;==>提取EFI分区盘符

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +99 收起 理由
haijie1223 + 99 小小金币,再接再厉

查看全部评分

发表于 2024-10-6 12:08:33 | 显示全部楼层

FileInstall("cx.exe", @TempDir & "\cx.exe")
RunWait(@ComSpec & " /C " & @TempDir & "\cx.exe -mohong >" & @ScriptDir & "\Part.Txt", @ScriptDir, @SW_HIDE)
Local $Text = FileRead(@ScriptDir & "\Part.Txt")
Local $aDrv = StringRegExp($Text, '(?m)^.+?(\w:)[^\v]+?EFI', 3)
If IsArray($aDrv) Then MsgBox(0, "找到引导分区", 'EFI分区盘符是:' & $aDrv[0])

发表于 2024-10-7 03:05:12 | 显示全部楼层
玩玩Av3再看易语言会简单点
 楼主| 发表于 2024-10-17 12:30:13 | 显示全部楼层

谢谢!这样简单多了!
发表于 2024-10-17 19:06:28 | 显示全部楼层
xztpc 发表于 2024-10-17 12:30
谢谢!这样简单多了!

这样吧,这样没有临时文件产生:
tiquefi()
Func tiquefi()
        FileInstall("cx.exe", @TempDir & "\cx.exe") 
        Local $ipid= Run(@ComSpec & " /C " & @TempDir & "\cx.exe -mohong", @ScriptDir, @SW_HIDE,15) 
        ProcessWaitClose($ipid)
        Local $aDrv = StringRegExp(StdoutRead($ipid), '(?m)^.+?(\w:)[^\v]+?EFI', 3)
        If IsArray($aDrv) Then MsgBox(0, "找到引导分区", 'EFI分区盘符是:' & $aDrv[0])
EndFunc   ;==>tiquefi
 楼主| 发表于 2024-10-18 08:49:10 | 显示全部楼层
本帖最后由 xztpc 于 2024-10-18 08:50 编辑

但是我加上这一句:$aDrv变量就出不来了
Func tiquefi()
        FileInstall("cx.exe", @TempDir & "\cx.exe") 
        Local $ipid= Run(@ComSpec & " /C " & @TempDir & "\cx.exe -mohong", @ScriptDir, @SW_HIDE,15) 
        ProcessWaitClose($ipid)
        Local $aDrv = StringRegExp(StdoutRead($ipid), '(?m)^.+?(\w:)[^\v]+?EFI', 3)
        If IsArray($aDrv) Then RunWait(@ComSpec & " /C bcdboot.exe C:\windows /s " & $aDrv & " /f UEFI /l zh-cn", @ScriptDir, @SW_HIDE)
EndFunc   ;==>tiquefi
 楼主| 发表于 2024-10-18 08:57:06 | 显示全部楼层
本帖最后由 xztpc 于 2024-10-18 10:24 编辑
haijie1223 发表于 2024-10-17 19:06
已处理!是我自己马虎了忘记加:[0],见笑了!

把信息框换成cmd命令,就读不出$aDrv变量了
RunWait(@ComSpec & " /C bcdboot.exe C:\windows /s " & $aDrv & " /f UEFI /l zh-cn", @ScriptDir, @SW_HIDE)
发表于 2024-10-18 14:29:09 | 显示全部楼层
xztpc 发表于 2024-10-18 08:57
把信息框换成cmd命令,就读不出$aDrv变量了

这样试试  $aDrv[0]
 楼主| 发表于 2024-10-22 14:07:44 | 显示全部楼层
haijie1223 发表于 2024-10-18 14:29
这样试试  $aDrv[0]

谢谢!原先只是写$aDrv没带上[0],导致失败,现在$aDrv[0]这样写就好了!刚玩AU3小白!见笑了!
发表于 3 天前 | 显示全部楼层
本帖最后由 令狐大虾 于 2024-12-28 08:14 编辑

请问楼主这个cx.exe是32位版本么?如不是请提供一下。找到了谢谢
发表于 3 天前 | 显示全部楼层
本帖最后由 令狐大虾 于 2024-12-28 16:33 编辑

请问cxdir.exe可以像mountvol.exe挂载及卸载ESP分区么。以下是模仿楼主的代码修改一下

                    FileInstall('相关调用\CxDirX64.exe', @TempDir & '\CxDirX64.exe', 1)
                    Local $ipid= Run(@ComSpec & ' /C ' & @TempDir & '\CxDirX64.exe -mohong', @ScriptDir, @SW_HIDE,15)
                    ProcessWaitClose($ipid)
                         Local $aDrv = StringRegExp(StdoutRead($ipid), '(?m)^.+?(\w:)[^\v]+?EFI', 3)
                    If IsArray($aDrv) Then
                        ;RunWait(@ComSpec & ' /c ' & 'format ' & $aDrv[0] & ' /fs:fat32 /q /x /y','', @SW_HIDE)
                        ;RunWait(@ComSpec & ' /C ' & 'bcdboot C:\windows /s ' & $aDrv[0] & ' /f uefi /l zh-cn', @ScriptDir, @SW_HIDE)
                        ShellExecuteWait($aDrv[0])
                        MsgBox(64,'提示','启动文件已经成功写入ESP分区'&@CRLF&@CRLF&'请按确定后退出!')
                        RunWait(@ComSpec & ' /c ' & 'mountvol.exe ' & $aDrv[0] & ' /d', '', @SW_HIDE)
                    EndIf

发表于 昨天 22:04 | 显示全部楼层
本帖最后由 令狐大虾 于 2024-12-30 22:13 编辑
haijie1223 发表于 2024-10-18 14:29
这样试试  $aDrv[0]

请问版主,这个比较微软的mountvol.exe,哪一个更加准确,我实际使用中发现某些GPT磁盘ESP分区存在逻辑错误会导致mountvol.exe无法挂载。
还有cxdir.exe挂载后的盘符可否指定为例如M呢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-31 01:50 , Processed in 0.081891 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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