|
启动盘制作工具(原创)带1.0源码
网上搜索了一圈暂末找到可用的au3制盘工具源码就发一个出来吧,数据在diy文件夹中,带有ventoy与微pe,多种批量制作等等,当然也可手工置放成其它或自己的pe数据,云盘中是不定期长期更新的肯定会好用些,建议感兴趣的朋友收藏,本工具云盘链接:
https://www.123912.com/s/7ktmjv-Vjbv3?提取码:NYvZ
共享总链接:
https://www.123912.com/s/7ktmjv-Qubv3
1.0基础版源码如下(本基础版仅供新手学习叁考之用,还有很多地方需修改完善,如进度条等等,更多更好请云盘下载试用)
#RequireAdmin
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>
Global $aDisks[0][3] ; [Index, Model, SizeGB]
; 创建主界面
Local $hGUI = GUICreate("制盘工具1.0", 600, 450)
GUICtrlCreateLabel("选择目标磁盘:", 10, 10)
Global $cDiskList = GUICtrlCreateCombo("", 10, 30, 580, 20, $CBS_DROPDOWNLIST)
GUICtrlCreateLabel("分区表类型:", 10, 60)
Global $rMBR = GUICtrlCreateRadio("MBR", 100, 60, 50)
Global $rGPT = GUICtrlCreateRadio("GPT", 160, 60, 50)
GUICtrlSetState($rMBR, $GUI_CHECKED)
GUICtrlCreateLabel("启动分区大小 (GB):", 10, 90)
Global $iBootSize = GUICtrlCreateInput("1", 100, 90, 50, 20)
GUICtrlCreateLabel("第二分区大小 (GB,留空为剩余):", 10, 120)
Global $iPart2Size = GUICtrlCreateInput("", 200, 120, 50, 20)
GUICtrlCreateLabel("第二分区格式:", 10, 150)
Global $cPart2Format = GUICtrlCreateCombo("NTFS", 100, 150, 100, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData($cPart2Format, "FAT32|exFAT", "NTFS")
GUICtrlCreateLabel("第三分区格式:", 10, 180)
Global $cPart3Format = GUICtrlCreateCombo("NTFS", 100, 180, 100, 20, $CBS_DROPDOWNLIST)
GUICtrlSetData($cPart3Format, "FAT32|exFAT", "NTFS")
Global $bStart = GUICtrlCreateButton("开始制作", 250, 350, 100, 30)
Global $idProgress = GUICtrlCreateProgress(10, 400, 580, 20, $PBS_SMOOTH)
; 初始化磁盘列表
RefreshDiskList()
GUISetState(@SW_SHOW)
While 1
Local $nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $bStart
StartProcess()
EndSwitch
WEnd
Func RefreshDiskList()
Local $objWMIService = ObjGet("winmgmts:\\.\root\cimv2")
Local $colDisks = $objWMIService.ExecQuery("SELECT * FROM Win32_DiskDrive")
ReDim $aDisks[0][3]
GUICtrlSetData($cDiskList, "")
For $objDisk In $colDisks
Local $iSizeGB = Round($objDisk.Size / 1000^3)
Local $sText = "Disk " & $objDisk.Index & ": " & StringStripWS($objDisk.Model, 2) & " (" & $iSizeGB & " GB)"
GUICtrlSetData($cDiskList, $sText)
ReDim $aDisks[UBound($aDisks)+1][3]
$aDisks[UBound($aDisks)-1][0] = $objDisk.Index
$aDisks[UBound($aDisks)-1][1] = StringStripWS($objDisk.Model, 2)
$aDisks[UBound($aDisks)-1][2] = $iSizeGB
Next
EndFunc
Func StartProcess()
Local $sSelected = GUICtrlRead($cDiskList)
Local $iDiskIndex = -1
; 查找选择的磁盘
For $i = 0 To UBound($aDisks)-1
If $sSelected = "Disk " & $aDisks[$i][0] & ": " & $aDisks[$i][1] & " (" & $aDisks[$i][2] & " GB)" Then
$iDiskIndex = $aDisks[$i][0]
ExitLoop
EndIf
Next
If $iDiskIndex = -1 Then Return MsgBox(16, "错误", "请选择有效磁盘")
; 获取参数
Local $sPartType = (GUICtrlRead($rMBR) = $GUI_CHECKED) ? "MBR" : "GPT"
Local $iBootSizeGB = Number(GUICtrlRead($iBootSize))
Local $iPart2SizeGB = Number(GUICtrlRead($iPart2Size))
Local $sPart2Format = GUICtrlRead($cPart2Format)
Local $sPart3Format = GUICtrlRead($cPart3Format)
; 生成diskpart脚本
Local $sScript = "select disk " & $iDiskIndex & @CRLF & _
"clean" & @CRLF & _
"convert " & $sPartType & @CRLF & _
"create partition primary size=" & ($iBootSizeGB * 1024) & @CRLF & _
"format fs=fat32 label=U1 quick" & @CRLF & _
"assign" & @CRLF
; 第二分区
If $iPart2SizeGB > 0 Then
$sScript &= "create partition primary size=" & ($iPart2SizeGB * 1024) & @CRLF
Else
$sScript &= "create partition primary" & @CRLF
EndIf
$sScript &= "format fs=" & $sPart2Format & " label=U2 quick" & @CRLF & _
"assign" & @CRLF
; 第三分区(如果有剩余空间)
If $iPart2SizeGB > 0 Then
$sScript &= "create partition primary" & @CRLF & _
"format fs=" & $sPart3Format & " label=U3 quick" & @CRLF & _
"assign" & @CRLF
EndIf
; 保存并运行脚本
Local $sTempFile = @TempDir & "\diskpart_script.txt"
FileDelete($sTempFile)
FileWrite($sTempFile, $sScript)
RunWait('diskpart /s "' & $sTempFile & '"', "", @SW_HIDE)
; 查找分区盘符
Local $sU1Drive = FindVolume("U1")
Local $sU2Drive = FindVolume("U2")
Local $sU3Drive = FindVolume("U3")
; 复制文件
UpdateProgress(25, "正在复制启动文件...")
DirCopy(@ScriptDir & "\diy\esp", $sU1Drive & "\", 1)
UpdateProgress(50, "正在复制数据文件...")
DirCopy(@ScriptDir & "\diy\data", $sU2Drive & "\", 1)
If $sU3Drive Then
UpdateProgress(75, "正在复制附加数据...")
DirCopy(@ScriptDir & "\diy\data3", $sU3Drive & "\", 1)
EndIf
; 隐藏启动分区
RunWait('mountvol ' & StringLeft($sU1Drive, 2) & ' /D', "", @SW_HIDE)
UpdateProgress(100, "操作完成!")
MsgBox(64, "完成", "制盘成功完成!")
EndFunc
Func FindVolume($sLabel)
For $i = 1 To 10
Local $aDrives = DriveGetDrive("ALL")
If Not @error Then
For $j = 1 To $aDrives[0]
If DriveGetLabel($aDrives[$j]) = $sLabel Then
Return $aDrives[$j]
EndIf
Next
EndIf
Sleep(1000)
Next
Return SetError(1, 0, "")
EndFunc
Func UpdateProgress($iPercent, $sText)
GUICtrlSetData($idProgress, $iPercent)
WinSetTitle($hGUI, "", "制盘工具 - " & $sText)
EndFunc |
|