Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Небольшая програмка для выбора запускаемой OS (http://forum.oszone.net/showthread.php?t=131486)

speechless 09-02-2009 22:26 1033971

Небольшая програмка для выбора запускаемой OS
 
Нужда была - состряпал. Опыт небольшой, так что не пинайте ногами. Если кому понравиться, пользуйтесь (есть ещё). Подсказки и мат приму с благодарностью. Описание делать не буду: запустите и посмотрите help - все станет ясно.
Код:

Код:

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
Opt("TrayMenuMode",1)        ; Default tray menu items (Script Paused/Exit) will not be shown.
$nameOS1="OS#1"
$nameOS2="OS#2"
$nameDefault="Microsoft Windows XP Professional RU"
$timeout="30"
dim $sizeArray[10]
$drive = DriveGetDrive( "FIXED" ) ;все FIXED диски
        If NOT @error Then
                For $i = 1 to $drive[0]
                        If FileExists($drive[$i]&"\boot.ini") Then ;если boot.ini на диске есть
                                $size = FileGetSize($drive[$i]&"\boot.ini") ;получаем размер boot.ini
                                _ArrayInsert( $sizeArray,$i,$size) ;добовляем в массив размер boot.ini
                        EndIf
                Next
                ;_ArrayMaxIndex( $sizeArray, 1, 0)  -индекс максимального значения массива(размер boot.ini)
                $bootPath=$drive[_ArrayMaxIndex( $sizeArray, 1, 0)]&"\boot.ini" ;путь к boot.ini наибольшего размера       
        EndIf
Dim $nameArray[5] ;массив для псевдонимов без кавычек
$keyValue = IniReadSection($bootPath, "operating systems") ;читаем из выбранного boot.ini ключ=значение
        If @error Then
                MsgBox(64, "Обломайся", "Либо это не XP (2000)          "&@CRLF&"Либо ты не админ")
                Exit
        Else
                For $i = 1 To $keyValue[0][0]
                        $nameOS = StringSplit($keyValue[$i][1], " /",1) ;получаем названия (псевдонимы) OS
                        $keyDefault=IniRead($bootPath, "boot loader", "default", "No") ;получаем default ключ
                                If $keyValue[$i][0]=$keyDefault Then ;если ключи равны
                                        $nameDefault="Загрузка  "&StringTrimRight(StringTrimLeft($nameOS[1], 1),1) ;присваеваем значение соответствующее default ключу
                                        ;MsgBox(0, "123",$keyValue[$i][1])
                                Endif
                        $result = StringTrimRight(StringTrimLeft($nameOS[1], 1),1) ;отрезаем кавычки
                        _ArrayInsert( $nameArray,$i,$result);добовляем в массив псевдонимы
                Next
                        $nameOS1=$nameArray[1] ;меняем надписи на кнопках на псевдонимы
                        $nameOS2=$nameArray[2] ;меняем надписи на кнопках на псевдонимы
        EndIf
$timeout = IniRead($bootPath, "boot loader", "timeout", "31") ;получаем timeout из boot.ini
$Form1_1 = GUICreate("BootOS 2.0", 290, 194, 329, 166)
$exitTray        = TrayCreateItem("Выход")
$PageControl1 = GUICtrlCreateTab(3, 3, 285, 189, -1, $TCS_EX_FLATSEPARATORS)
GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
$TabSheet1 = GUICtrlCreateTabItem("General")
$ButtonOS1 = GUICtrlCreateButton($nameOS1, 15, 64, 259, 25)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
GUICtrlSetTip(-1, "Загрузка с "&$nameOS1)
If StringLen($nameOS1)=0 Then ;если строки нет то
        GUICtrlSetState ( $ButtonOS1, $GUI_DISABLE) ;оключить кнопку
EndIf
$ButtonOS2 = GUICtrlCreateButton($nameOS2, 15, 96, 259, 25, 0)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
GUICtrlSetTip(-1, "Загрузка с "&$nameOS2)
If StringLen($nameOS2)=0 Then ;если строки нет то
        GUICtrlSetState ( $ButtonOS2, $GUI_DISABLE) ;оключить кнопку
EndIf
$Label1 = GUICtrlCreateLabel("Выбор OS для загрузки", 16, 33, 137, 19)
GUICtrlSetFont(-1, 9, 400, 0, "Arial")
GUICtrlSetColor(-1, 0x316AC5)
$ButtonShutdown = GUICtrlCreateButton("Выключение", 15, 144, 129, 25, -1, $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
$ButtonReboot = GUICtrlCreateButton("Перезагрузка", 145, 144, 130, 25, -1, $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
$LabelCreat = GUICtrlCreateLabel("created by rz", 109, 173, 69, 18)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
$LabelDefault = GUICtrlCreateLabel($nameDefault, 25, 127, 236, 12,$SS_LEFTNOWORDWRAP)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
$TabSheet2 = GUICtrlCreateTabItem("Setting")
$LabelPsevdo = GUICtrlCreateLabel("Псевдонимы OS (отображаются при загрузки)", 20, 35, 245, 12)
$inputPsevdo1=GUICtrlCreateInput ($nameOS1, 20,  55, 247, 20)  ; input для смены псевдонима OS1
GUICtrlSetTip(-1, "Английские буквы (русские только в DOS кодировке)")
If StringLen($nameOS1)=0 Then ;если строки нет то
        GUICtrlSetState ( $inputPsevdo1, $GUI_DISABLE) ;оключить input
EndIf
$inputPsevdo2=GUICtrlCreateInput ($nameOS2, 20,  80, 247, 20)  ; input для смены псевдонима OS2
GUICtrlSetTip(-1, "Английские буквы (русские только в DOS кодировке)")
If StringLen($nameOS2)=0 Then ;если строки нет то
        GUICtrlSetState ( $inputPsevdo2, $GUI_DISABLE) ;оключить input
EndIf
$ButtonPsevdonim = GUICtrlCreateButton("Принять", 170, 150, 100, 25, $BS_DEFPUSHBUTTON )
$InputTimeout = GUICtrlCreateInput($timeout, 20, 120, 40, 20)
$updownTimeout = GUICtrlCreateUpdown($inputTimeout)
GUICtrlSetLimit(-1,999)
$LabelTimeout = GUICtrlCreateLabel("Timeout (время ожидания)", 70, 124, 269, 30)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$TabSheet3 = GUICtrlCreateTabItem("Help")
$LabelHelp = GUICtrlCreateLabel("  BootOS 2.0 для тех, у кого на компьютере установленно две операционные системы (XP;2K). Позволяет выбрать 'OS по умолчанию' для следующей загрузки."&@CRLF&"  BootOS 2.0 использует (перезаписывает) системный файл BOOT.INI, потому рекомендую сделать резервную копию этого файла."&@CRLF&"  Прога не лишена недостатков т.к. писалась под свои нужды и распространяется как есть."&@CRLF&"  Куда пойти и чем занятся пишите rz-74@mail.ru"&@CRLF&"  Спасибо AutoIt !!!", 8, 29, 275, 159, -1, $WS_EX_CLIENTEDGE)
GUICtrlSetFont(-1, 8, 400, 0, "Arial")
GUICtrlSetBkColor(-1, 0xC0DCC0)
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
While 1
    $msg = GUIGetMsg()
        $msgTray = TrayGetMsg()
    Select
                case $msg = $GUI_EVENT_CLOSE
                          ExitLoop
                Case $msgTray = $exitTray
                          ExitLoop       
                case $msg = $ButtonOS1
                        FileSetAttrib($bootPath, "-R") ;снять атрибут чтения
                        IniWrite ( $bootPath, "boot loader", "default", $keyValue[1][0] ) ;записать новое значение default
                        FileSetAttrib($bootPath, "+R") ;поставить атрибут чтения
                        $nameDefault="Загрузка  "&$nameArray[1] ;присваеваем значение соответствующее default ключу
                        GUICtrlSetData($LabelDefault,$nameDefault) ;выводим новый текст default
                  case $msg = $ButtonOS2
                        FileSetAttrib($bootPath, "-R") ;снять атрибут чтения
                          IniWrite ( $bootPath, "boot loader", "default", $keyValue[2][0] ) ;записать новое значение default
                        FileSetAttrib($bootPath, "+R") ;поставить атрибут чтения
                        $nameDefault="Загрузка  "&$nameArray[2] ;присваеваем значение соответствующее default ключу
                        GUICtrlSetData($LabelDefault,$nameDefault);;выводим новый текст default
                case $msg = $ButtonPsevdonim
                        $zz=GUICtrlRead($InputTimeout)
                        $z=StringIsDigit(GUICtrlRead($InputTimeout))  ;проверка на цифры
                        If $z=1 and  $zz>=0 and $zz<=999 Then ;если целые числа от 0 до 999 то                               
                                $nameOS1=GUICtrlRead($inputPsevdo1)
                                GUICtrlSetData($ButtonOS1,$nameOS1);новый псевдоним на кнопке
                                GUICtrlSetTip($ButtonOS1, "Загрузка с "&$nameOS1) ;новый всплывающий псевдоним
                                $nameOS2=GUICtrlRead($inputPsevdo2)
                                GUICtrlSetTip($ButtonOS2, "Загрузка с "&$nameOS2) ;новый всплывающий псевдоним
                                GUICtrlSetData($ButtonOS2,$nameOS2);новый псевдоним на кнопке
                                FileSetAttrib($bootPath, "-R") ;снять атрибут чтения
                                If StringLen($nameOS1)>0 Then ;если строка есть то
                                        $keyValue[1][1]=StringRegExpReplace($keyValue[1][1], '"(.*?)"', '"'&$nameOS1&'"',1);создаем новое значение value1
                                        IniWrite ( $bootPath, "operating systems", $keyValue[1][0], $keyValue[1][1] ) ;записать новое значение value1
                                EndIf
                                If StringLen($nameOS2)>0 Then ;если строка есть то
                                        $keyValue[2][1]=StringRegExpReplace($keyValue[2][1], '"(.*?)"', '"'&$nameOS2&'"',1);создаем новое значение value2
                                        IniWrite ( $bootPath, "operating systems", $keyValue[2][0], $keyValue[2][1] ) ;записать новое значение value2
                                EndIf
                                IniWrite ( $bootPath, "boot loader", "timeout", GUICtrlRead ( $InputTimeout) ) ;записать новое значение timeout
                                FileSetAttrib($bootPath, "+R") ;поставить атрибут чтения
                                $keyDefault=IniRead($bootPath, "boot loader", "default", "No") ;получаем default ключ
                                For $i = 1 To $keyValue[0][0]
                                        $nameOS = StringSplit($keyValue[$i][1], " /",1) ;получаем названия (псевдонимы) OS
                                                If $keyValue[$i][0]=$keyDefault Then ;если ключи равны
                                                        $nameDefault="Загрузка  "&StringTrimRight(StringTrimLeft($nameOS[1], 1),1) ;присваеваем значение соответствующее default ключу
                                                Endif
                                        $result = StringTrimRight(StringTrimLeft($nameOS[1], 1),1) ;отрезаем кавычки
                                        _ArrayInsert( $nameArray,$i,$result);добовляем в массив псевдонимы
                                Next
                                GUICtrlSetData($LabelDefault,$nameDefault);новый псевдоним на метке default
                        Else
                                MsgBox (16, "Внимание Timeout", "Только целые числа от 0 до 999")
                        Endif
                case $msg = $ButtonShutdown
                        Shutdown (1)
                        ExitLoop
                case $msg = $ButtonReboot
                        Shutdown (2)
                        ExitLoop
    EndSelect
Wend


Creat0R 09-02-2009 23:01 1034006

Цитата:

Цитата speechless
Описание делать не буду »

Ну хоть назначение программы можно указать, в заголовке темы ничего интересного/познавательного нет, так нельзя :)

И что, тег кода уже отменили?

speechless 09-02-2009 23:41 1034048

Исправляюсь: программа для выбора оси для следующей загрузки (если конечно их больше одной).
ОСТОРОЖНО: использует/перезаписывает файл BOOT.INI.(хотя сколько пользуюсь проблем небыло).
Пока сделал выбор только из двух осей (повторюсь - делал для себя).
А на счет тега кода - буду много думать :biggrin:

Vadikan 09-02-2009 23:46 1034055

speechless, отредактируйте название темы (правка первого сообщения в расшир. режиме) и внесите описание программы в шапку.

speechless 15-02-2009 10:43 1038884

Столкнулся с несовместимостью версий AutoIt в некоторых скриптах, потому пишу версию, в которой точно работает: 3.2.6.0


Время: 20:28.

Время: 20:28.
© OSzone.net 2001-