Написал скрипт для создания загрузочной флешки: https://youtu.be/jJ2e11_RNuI
Хочу написать к нему GUI с выбором что загружать.
Вот наработки:
Не знаю как сделать так чтобы, когда отметили ПО галочкой, то вывести размер, которое оно займет после загрузки. Если отметили еще что-то, то приплюсовать размер к уже отмеченным, а если убрали галочку, то вычесть. Плюс нужно проверять на наличие свободного места на флешке, если размер скачиваемого превышает свободное место, то вывести предупреждение.
Хочу написать к нему GUI с выбором что загружать.
Вот наработки:
Код:
#include <GUIConstantsEx.au3>
#include <ComboConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
Global $ProgramName[14]=[ _
"Slax", _
"Slitaz", _
"TinyCore", _
"NTPasswd", _
"SystemRescue", _
"pra03-1608middle", _
"Kaspersky Rescue Disk", _
"MHDD", _
"HDAT2", _
"Viсtoria", _
"MemTest-86", _
"GParted", _
"HDClone", _
"Clonezilla"]
Global $ArrayFileName[15]=[ _
"memtest86-iso.zip", _
"v35fdd.zip", _
"mhdd32ver4.6iso.zip", _
"TinyCore-current.iso", _
"slitaz-rolling-core.md5", _
"slitaz-rolling-core.iso", _
"pra03-1608middle.iso", _
"systemrescuecd-x86-5.2.2.iso", _
"clonezilla-live-2.5.5-38-amd64.zip", _
"slax-64bit-9.5.0.iso", _
"gparted-live-0.31.0-1-amd64.iso", _
"cd140201.zip", _
"HDClone.8.0.7.FE.ru.zip", _
"hdat2img_64.img", _
"krd.iso"]
Global $ArrayFileURL[15]=[ _
"http://ftp.sh.cvut.cz/slax/Slax-9.x/slax-64bit-9.5.0.iso", _
"http://distro.ibiblio.org/slitaz/iso/rolling/slitaz-rolling-core.iso", _
"http://distro.ibiblio.org/slitaz/iso/rolling/slitaz-rolling-core.md5", _
"https://www.memtest86.com/downloads/memtest86-iso.zip", _
"http://www.ihdd.ru/download/software/victoria/v35fdd.zip", _
"http://www.ihdd.ru/download/software/mhdd/mhdd32ver4.6iso.zip", _
"http://www.tinycorelinux.net/9.x/x86/release/TinyCore-current.iso", _
"https://mirror.yandex.ru/puppyrus/puppyrus-a/pra03/iso/1608/pra03-1608middle.iso", _
"https://sourceforge.net/projects/systemrescuecd/files/sysresccd-x86/5.2.2/systemrescuecd-x86-5.2.2.iso", _
"https://osdn.net/frs/redir.php?m=cznic&f=clonezilla%2F69273%2Fclonezilla-live-2.5.5-38-amd64.zip", _
"https://sourceforge.net/projects/gparted/files/gparted-live-stable/0.31.0-1/gparted-live-0.31.0-1-amd64.iso", _
"http://pogostick.net/~pnh/ntpasswd/cd140201.zip", _
"https://www.hdat2.com/files/hdat2img_64.img", _
"https://www.miray.de/public/download/HDClone.8.0.7.FE.ru.zip", _
"https://rescuedisk.s.kaspersky-labs.com/updatable/2018/krd.iso"]
Global $md5summ[13]=[ _
"0xEEDCCC270B54D49FD12D310B2A33315C", _ ;memtest
"0xBA8B2D24DD0C66DDBB88D4657C13E9F0", _ ;viktoria
"0xF8E30535C025645E32D49CF75E18ABF8", _ ;mhdd
"0x2A7A52285C846314D1DBD79E9818270D", _ ;tinycore
"", _ ;md5Slitaz
"", _ ;SlitazISO
"0x193F099ABFEE803B7EB950B50726078B", _ ;Puppy
"0x217C4AD1BC5C54B2E21EF8C390004CE5", _ ;sysrcd
"0x597DD9C77098EAD37A665859FD175F96", _ ;clonezilla
"0x9744D4E2DCE3B07FAC84A8C09B545BFF", _ ;slax
"0x0B277DC939440198D6FF1845DED786AA", _ ;gparted
"0xF274127BF8BE9A7ED48B563FD951AE9E", _ ;ntpasswd
""] ;krd
$Title="CBFD"
$Files = @ScriptDir & "\files"
$GrubInstPath = $Files & "\grubinst.exe "
$GrldrPath = $Files & "\grldr"
$MenuPath = $Files & "\menu.lst"
Local $hGUI = GUICreate($Title, 800, 500)
GUICtrlCreateLabel("Выберите флешку:",10, 10)
$Combo2 = GUICtrlCreateCombo("", 160, 10, 50, 23, $CBS_DROPDOWNLIST + $WS_VSCROLL)
GUICtrlSetData(-1, SelectFlash())
GUICtrlCreateLabel("Установка загрузчика:", 10, 60)
Local $GrubBtn = GUICtrlCreateButton("Установить Grub4dos", 10, 85, 160)
$InfoFlash = GUICtrlCreateEdit("", 338, 35, 171, 160, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
GUICtrlSetFont($InfoFlash,"8.9","","","Lucida Console")
GUICtrlSendMsg($InfoFlash, $EM_SETREADONLY, True, 0)
GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0)
GUICtrlCreateGroup("Вывод сообщений: ", 520, 10, 277, 470)
$Edit = GUICtrlCreateEdit("" & @CRLF, 530, 30, 260, 440, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
GUICtrlSetFont($Edit,"10","","","Lucida Console")
GUICtrlSendMsg($Edit, $EM_SETREADONLY, True, 0)
GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0)
GUICtrlCreateGroup("Выберите ПО: ", 4, 200, 506, 235)
Global $0 = GUICtrlCreateCheckbox($ProgramName[0], 15, 225, 47, 16)
Global $1 = GUICtrlCreateCheckbox($ProgramName[1], 15, 255, 57, 16)
Global $2 = GUICtrlCreateCheckbox($ProgramName[2], 15, 285, 77, 16)
Global $3 = GUICtrlCreateCheckbox($ProgramName[3], 15, 315, 90, 16)
Global $4 = GUICtrlCreateCheckbox($ProgramName[4], 15, 345, 117, 16)
Global $5 = GUICtrlCreateCheckbox($ProgramName[5], 15, 375, 127, 16)
Global $6 = GUICtrlCreateCheckbox($ProgramName[6], 15, 405, 165, 16)
Global $7 = GUICtrlCreateCheckbox($ProgramName[7], 195, 225, 137, 16)
Global $8 = GUICtrlCreateCheckbox($ProgramName[8], 195, 255, 137, 16)
Global $9 = GUICtrlCreateCheckbox($ProgramName[9], 195, 285, 137, 16)
Global $10 = GUICtrlCreateCheckbox($ProgramName[10], 195, 315, 137, 16)
Global $11 = GUICtrlCreateCheckbox($ProgramName[11], 390, 225, 72, 16)
Global $12 = GUICtrlCreateCheckbox($ProgramName[12], 390, 255, 76, 16)
Global $13 = GUICtrlCreateCheckbox($ProgramName[13], 390, 285, 79, 16)
Local $AddSoftBtn = GUICtrlCreateButton("Добавить ПО на флешку", 10, 450, 180)
Local $TestFlashBtn = GUICtrlCreateButton("Проверить загрузку с флешки", 287, 450, 220)
GUISetState(@SW_SHOW, $hGUI)
If FileExists($Files) = False Then
MsgBox(16,$Title,"Каталог "&$Files&" не найден!")
Exit
EndIf
Local $iMsg
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GrubBtn
if ChkFlashStatus() = True Then
GetFlashPartID()
FormatFlash()
ChkFlashStatus()
RunGrub()
EndIf
Case $Combo2
ChkFlashStatus()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $AddSoftBtn
Case $TestFlashBtn
Case $0
$b = 0
Do
$FileSize = InetGetSize($ArrayFileURL[0],1)
$b = $b + 1
If $FileSize <> 0 Then ExitLoop
Until $b = 3
if $FileSize = 0 Then
MsgBox(16,$Title,"Не удалось получить размер файла!" & $ArrayFileName[0])
Exit
Else
GUICtrlCreateLabel(Round($FileSize / 1048576, 2), 400, 400)
EndIf
Case $1
Case $2
Case $3
Case $4
Case $5
Case $6
Case $7
Case $8
Case $9
Case $10
Case $12
Case $13
EndSwitch
WEnd
GUIDelete($hGUI)
Func SelectFlash()
Local $aArray = DriveGetDrive("REMOVABLE")
If @error Then
MsgBox(4096, "Ошибка", "Произошла ошибка при запросе дисков."&@CRLF&@CRLF&"Съемных устройств не найдено!")
Return 0
EndIf
Return StringUpper(_ArrayToString($aArray, "|", 1))
EndFunc
Func ChkFlashStatus()
Global $SelectLetter=GUICtrlRead($Combo2)
$Status=DriveStatus($SelectLetter)
If $Status = "READY" Then
GUICtrlCreateLabel("Информация о флешке: " & $SelectLetter, 345, 10)
$Label=DriveGetLabel ($SelectLetter)
$TypeFS=DriveGetFileSystem ($SelectLetter)
If $TypeFS = 1 Then
MsgBox(16,$Title,"Не удалось получить информацию о ФС на флешке!"&@CRLF&"Переподклшючите флешку и попробуйте еще раз или отформатируйте флешку вручную.")
exit
EndIf
$SizeFlash=Floor(DriveSpaceTotal ($SelectLetter))
GUICtrlCreateLabel("/" & $SizeFlash , 450, 400)
$FreeFlash=Floor(DriveSpaceFree ($SelectLetter))
$Status=DriveStatus ($SelectLetter)
GUICtrlSetData($InfoFlash,"")
GUICtrlSetData($Edit,"")
GUICtrlSetData($Edit,"Выбрана флешка: " & $SelectLetter)
GUICtrlSetData($InfoFlash,"Имя флешки: "&$Label &@CRLF&@CRLF& "Тип ФС: "&$TypeFS & @CRLF&@CRLF & "Объем флешки: "&$SizeFlash&" МБ"&@CRLF&@CRLF&"Свободно: "&@CRLF&$FreeFlash&" МБ"&@CRLF&@CRLF&"Статус: "&$Status, 1)
Return True
ElseIf $Status = "INVALID" Then
GUICtrlSetData($Edit,"")
GUICtrlSetData($InfoFlash,"")
GUICtrlSetData($InfoFlash,$Status)
GUICtrlSetData($Edit,"Данная буква: " & $SelectLetter & " не используется."&@CRLF&"Флешка извлечена?"&@CRLF&"Подключите флешку и выберите ее букву")
Return False
ElseIf $Status=DriveStatus($SelectLetter) = "UNKNOWN" Then
GUICtrlSetData($Edit,"")
GUICtrlSetData($InfoFlash,"")
GUICtrlSetData($InfoFlash,$Status)
GUICtrlSetData($Edit,"Возможно, устройство не отформатировано (RAW)!")
Return False
EndIf
EndFunc
Func GetFlashPartID()
Local $objWMI, $objCollection, $objItem, $objWSNet
Local $objLogicalDisks, $objLD, $objPartitions, $objPart
Local $strComputer
Global $strTemp = ""
$ObjWMI = ObjGet("winmgmts:\\" & @ComputerName & "\root\CIMV2")
MsgBox(0,"Partid",$SelectLetter) ;F:
$ObjCollection = $ObjWMI.ExecQuery("SELECT * FROM Win32_LogicalDisk where Name = '" & $SelectLetter & "'", "WQL", 0x30)
$n = 0
Local $ObjItem, $i = 0
For $ObjItem In $ObjCollection
$objLogicalDisks = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=""" & $objItem.DeviceID & """} WHERE AssocClass=Win32_LogicalDiskToPartition")
For $objLD In $objLogicalDisks
$objPartitions = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID=""" & $objLD.DeviceID & """} WHERE AssocClass=Win32_DiskDriveToDiskPartition")
For $objPart In $objPartitions
$strTemp = $strTemp & " "& $objPart.Name & ""
Next
$objPart = Null
$objPartitions = Null
Next
$objLD = Null
$objLogicalDisks = Null
Next
$objItem = Null
$objCollection = Null
$objWMI = Null
If $strTemp = "" Then
$strTemp = "Произошла ошибка!."
EndIf
MsgBox(0,"",$strTemp) ;//./PHYSICALDRIVE1
EndFunc
Func FormatFlash()
$FAT32="fat32"
$NTFS="NTFS"
$DiskPartFile = "diskpart.txt"
$Log = "log.txt"
$hGui = GUICreate($Title, 220, 100)
GUICtrlCreateLabel("Выберите файловую систему:", 10, 5)
Global $FAT32Radio = GUICtrlCreateRadio("FAT32", 8, 40, 62, 16)
Global $NTFSRadio = GUICtrlCreateRadio("NTFS", 8, 70, 60, 16)
Global $BtnOk = GUICtrlCreateButton("OK", 130, 30,80,25)
GUICtrlSetState($BtnOK, $GUI_DISABLE)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $FAT32Radio
SetButtonState()
Case $NTFSRadio
SetButtonState()
Case $BtnOk
If FileExists($DiskPartFile) = True Then
FileDelete($DiskPartFile)
Sleep(1000)
EndIf
$len = StringLen($strTemp)
$sResult = StringTrimLeft($strTemp, $len-1)
If GUICtrlRead($FAT32Radio) = $GUI_CHECKED Then
$FS = $FAT32
ElseIf GUICtrlRead($NTFSRadio) = $GUI_CHECKED Then
$FS = $NTFS
EndIf
GUIDelete()
If MsgBox(32+4+262144,$Title,"!!!ВНИМАНИЕ!!! " &@CRLF&@CRLF& " Флешка: " & $SelectLetter &" будет отформатирована!"&@CRLF&@CRLF&"Все данные будут потеряны!" &@CRLF& "Продолжить?") = 6 Then
MsgBox(32,$Title,"Вы нажали ""Да"". Сейчас произойдет форматирование флешки: " & $SelectLetter & @CRLF & " в файловой системе: "&$FS)
$hFile = FileOpen($DiskPartFile, 1)
; Проверяет, является ли файл открытым, перед тем как использовать функции чтения/записи в файл
If $hFile = -1 Then
MsgBox(4096, $Title, "Невозможно открыть файл.")
Exit
EndIf
FileWrite($hFile,"list disk"&@CRLF&"select disk " &$sResult& @CRLF & "attributes disk clear readonly" & @CRLF & "clean" & @CRLF&"create partition primary" &@CRLF&"format fs="&$FS&@CRLF&"exit")
FileClose($hFile)
MsgBox(0,"",$sResult&@CRLF&$FS&@CRLF&$DiskPartfile)
;RunWait(@ComSpec & ' /c '& "diskpart /s "&$DiskPartFile)
ExitLoop
Else
ExitLoop
EndIf
EndSwitch
WEnd
EndFunc
Func SetButtonState()
If GUICtrlRead($FAT32Radio) = $GUI_CHECKED _
or GUICtrlRead($NTFSRadio) = $GUI_CHECKED _
Then
GUICtrlSetState($BtnOK, $GUI_ENABLE)
Else
GUICtrlSetState($BtnOK, $GUI_DISABLE)
EndIf
EndFunc
Func RunGrub()
$hd=StringReplace($strTemp, " \\.\PHYSICALDRIVE", "hd")
;RunWait(@ComSpec & " /c " & $GrubInstPath & "("&$hd&")")
MsgBox(0,"",$GrubInstPath&" "&$hd)
$SelectLetter=$SelectLetter&"\"
_FileCopy($GrldrPath,$SelectLetter)
If FileExists($SelectLetter&"grldr") = False Then
MsgBox(16,$Title,"Файл grldr не скопировался!")
Exit
EndIf
EndFunc
Func FileCopyToFlash()
EndFunc
Func _FileCopy($fromFile,$tofile)
Local $FOF_RESPOND_YES = 16
Local $FOF_SIMPLEPROGRESS = 256
$winShell = ObjCreate("shell.application")
$winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
EndFunc
Не знаю как сделать так чтобы, когда отметили ПО галочкой, то вывести размер, которое оно займет после загрузки. Если отметили еще что-то, то приплюсовать размер к уже отмеченным, а если убрали галочку, то вычесть. Плюс нужно проверять на наличие свободного места на флешке, если размер скачиваемого превышает свободное место, то вывести предупреждение.