Что нового

Скрипт для создания загрузочной флешки

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Написал скрипт для создания загрузочной флешки: https://youtu.be/jJ2e11_RNuI

Хочу написать к нему 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


Не знаю как сделать так чтобы, когда отметили ПО галочкой, то вывести размер, которое оно займет после загрузки. Если отметили еще что-то, то приплюсовать размер к уже отмеченным, а если убрали галочку, то вычесть. Плюс нужно проверять на наличие свободного места на флешке, если размер скачиваемого превышает свободное место, то вывести предупреждение.
 
Автор
T

Tuxzer92

Новичок
Сообщения
64
Репутация
0
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

Local $nCh1, $nCh2, $nCh3, $nCh4, $nCh5, $nCh6, $msg, $text, $FileSize
$TotalSize=0
$DownloadSize=3
$Free="9"
GUICreate("My GUI Checkbox") ; Создаёт окно в центре экрана
$Label=GUICtrlCreateLabel($text,10,50,100,50)
$Label2=GUICtrlCreateLabel($Free,50,50,100,50)
$nCh1 = GUICtrlCreateCheckbox("Checkbox 1", 10, 10, 120, 20)
$nCh2 = GUICtrlCreateCheckbox("Checkbox 2", 10, 90, 120, 20)
$nCh3 = GUICtrlCreateCheckbox("Checkbox 3", 10, 150, 120, 20)
GUISetState() ; показывает созданное окно

; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
   Switch $msg
	  Case $nCh1
		 Check($msg)
	  Case $nCh2
		 Check($msg)
	  Case $nCh3
		 Check($msg)
   EndSwitch
WEnd

Func Check($msg)
   If GUICtrlRead($msg) = $GUI_CHECKED Then
	  $TotalSize+=$DownloadSize
	  GUICtrlSetData ($Label, $TotalSize )
	  If $TotalSize >= $Free Then
		 MsgBox(16,"","ERROR")
	  EndIf
   EndIf
   If GUICtrlRead($msg) = $GUI_UNCHECKED Then
	   $TotalSize-=$DownloadSize
	  GUICtrlSetData ($Label, $TotalSize )
   EndIf
EndFunc

Решил так.
 
Верх