|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Определение редакций в wim файле. |
|
[решено] Определение редакций в wim файле.
|
![]() Старожил Сообщения: 422 |
Доброго дня.
Только начинаю изучать Autoit. Нужна помощь. Есть скрипт, нужно добавить перед монтированием wim файла определение редакций в образе и вывод их в окно GUICtrlCreateCombo. В окне GUICtrlCreateCombo должны отображатся индекс и имя, желательно и описание. Выбранному индексу нужно присвоить переменную. Чем получать информацию, Imagex или Dism значения не имеет. #include <ButtonConstants.au3> ; #include <TabConstants.au3> ; #include <WindowsConstants.au3> #include <FileOperations.au3> ; Local $sWorkDir Local $tools = @ScriptDir & '\tools' $hGui = GUICreate('Cutter Win8', 760, 560) $tab = GUICtrlCreateTab(3, 3, 760 - 6, 560 - 6) $tab0 = GUICtrlCreateTabItem("Источник") GUICtrlCreateLabel('Рабочая папка', 10, 40, 90, 17) $iInpWorkDir = GUICtrlCreateInput('', 100, 40, 400, 20) $iSelDir = GUICtrlCreateButton('-', 505, 40, 21, 21, $BS_ICON) GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0) GUICtrlSetTip(-1, 'Выбрать Рабочую папку') GUICtrlCreateLabel('install.wim', 10, 70, 90, 17) $iInpWim = GUICtrlCreateInput('', 100, 70, 400, 20) $iOpenWim = GUICtrlCreateButton('-', 505, 70, 21, 21, $BS_ICON) GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 4, 0) GUICtrlSetTip(-1, 'Выбрать wim-файл') $iBtnMount = GUICtrlCreateButton('-', 505 + 23, 70, 21, 21, $BS_ICON) GUICtrlSetImage(-1, @SystemDir & '\shell32.dll', 0, 0) GUICtrlSetTip(-1, 'Монтировать wim-файл') GUICtrlCreateLabel('Редакция', 10, 100, 90, 17) $index=GUICtrlCreateCombo ("", 100,100,150,24) ; GUICtrlSetData(-1,$wimlist&'1|wimpe|remark', $wiminfo) GUICtrlSetTip($index, "Индекс образа."&@CRLF&"") $tab0 = GUICtrlCreateTabItem("Пакеты") $tab1 = GUICtrlCreateTabItem("Компоненты") $tab2 = GUICtrlCreateTabItem("Драйвера") $tab3 = GUICtrlCreateTabItem("Выполнить") GUICtrlCreateTabItem("") ; определяет конец вкладок ; $iButton = GUICtrlCreateButton('Start', 10, 10, 120, 22) ; $iStatusBar = GUICtrlCreateLabel('StatusBar', 5, 260 - 20, 150, 17) GUISetState() While 1 Switch GUIGetMsg() Case $iSelDir ; пример с использованием GUI аналогичен для FileOpenDialog и FileSaveDialog $tmp = FileSelectFolder('Выберите папку', '', 3, @DesktopDir, $hGui) ; продолжить цикл опроса от начала, если выбор отменён или объект не является папкой, например "Мой компьютер" или Корзина If @error Or Not StringInStr(FileGetAttrib($tmp), "D") Then ContinueLoop ; $sWorkDir = $tmp GUICtrlSetData($iInpWorkDir, $tmp) Case $iOpenWim ; пример с использованием GUI аналогичен для FileOpenDialog и FileSaveDialog $tmp = FileOpenDialog("Выберите файл install.wim", @WindowsDir & "\", "Образ (*.wim)", 3, @DesktopDir, $hGui) ; продолжить цикл опроса от начала, если выбор отменён If @error Then ContinueLoop GUICtrlSetData($iInpWim, $tmp) Case $iBtnMount $iInpWim0 = GUICtrlRead($iInpWim) $tmp = _FO_IsDir($iInpWim0) If @error Or $tmp Then ContinueLoop ; Если нет ошибки и это папка, то продолжить цикл опроса от начала $folder = @ScriptDir & '\Mount' DirCreate($folder) $labelwim0 = 'WIM1' Run($tools & '\imagex.exe /mountrw "' & $iInpWim0 & '" "' & $labelwim0 & '" "' & $folder & '"', '', @SW_HIDE) Case -3 Exit EndSwitch WEnd |
|
Отправлено: 19:05, 10-08-2013 |
Старожил Сообщения: 254
|
Профиль | Отправить PM | Цитировать Вытащил код из Install_wim4.exe, страница описания и скачивания здесь
$sPath = 'F:\sources\install.wim' ; Вытаскиваем метку WIM-файла $sWimList = _Get_WimLabel($sPath) If @error Then Exit MsgBox(0, "Ошибка", 'Не найдена метка wim-файла.' & @LF & 'Без метки извлечь wim-файл невозможно.') $hGui = GUICreate('My Program', 250, 260) $Def_Metka = StringLeft($sWimList, StringInStr($sWimList & '|', '|') - 1) $iCombo = GUICtrlCreateCombo("", 10, 10, 190, 24) GUICtrlSetData(-1, $sWimList, $Def_Metka) GUISetState() While 1 Switch GUIGetMsg() Case -3 Exit EndSwitch WEnd Func _Get_WimLabel($sPath) Local $s_WIM_List = '' $iPID = Run('imagex.exe /info /xml "' & $sPath & '"', @SystemDir, @SW_HIDE, 2) ; Вызываем с ключом экспорта онформации While 1 $s_WIM_List &= StdoutRead($iPID, False, True) ; Чтение потока процесса If @error Then ExitLoop ; При ошибке выпрыг из цикла WEnd $aLabel = StringRegExp(BinaryToString($s_WIM_List, 2), "(?m)(?<=<NAME>)(.*?)(?=</NAME>)", 3) ; Вытаскиваем имя метки в тегах <NAME> If @error Then Return SetError(1, 0, '') Else $s_WIM_List = '' For $i = 0 To UBound($aLabel) - 1 $s_WIM_List &= $aLabel[$i] & '|' Next Return SetError(0, 0, StringTrimRight($s_WIM_List, 1)) EndIf EndFunc ;==>_Get_WimLabel |
Последний раз редактировалось AZJIO, 12-08-2013 в 11:30. Отправлено: 11:19, 12-08-2013 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 254
|
Профиль | Отправить PM | Цитировать Вот интересная WIMGAPI UDF. С помощью неё можно даже без EXE-файлов вызывать функции прямо из wimgapi.dll. Хотя с точки зрения интерфейса командной строки кажется более надёжней, так как внутренее обращение к wimgapi.dll через imagex.exe более нативное (выделение памяти, формат параметров и т.д.).
#include <ComboConstants.au3> #include <WindowsConstants.au3> #include <WimConstants.au3> #include <wimgapi.au3> $aResult = _WIM_Startup() ; Открывает wimgapi.dll If @error Then Exit MsgBox(0, 'Сообщение', 'Ошибка старта wimgapi.dll') $sPath = 'F:\sources\install.wim' $sWimList = _Get_WimLabel($sPath) If @error Then Exit MsgBox(0, "Ошибка", 'Не найдена метка wim-файла.' & @LF & 'Без метки извлечь wim-файл невозможно.') $hGui = GUICreate('My Program', 250, 260) $Def_Metka = StringLeft($sWimList, StringInStr($sWimList & '|', '|') - 1) $iCombo = GUICtrlCreateCombo("", 10, 10, 190, 24, $CBS_DROPDOWNLIST + $WS_VSCROLL) GUICtrlSetData(-1, $sWimList, $Def_Metka) GUISetState() While 1 Switch GUIGetMsg() Case -3 _WIM_Shutdown() ; закрывает открытый дескриптор wimgapi.dll Exit EndSwitch WEnd Func _Get_WimLabel($sWimFile) Local $aLabel, $aXML, $s_WIM_List If Not FileExists($sWimFile) Then Return SetError(1, 0, '') ; Файл не существует ; Открыть существующий с доступом чтения $hWim = _WIM_CreateFile($sWimFile, $WIM_GENERIC_READ, $WIM_OPEN_EXISTING, 0, 0, 0) If Not $hWim Then Return SetError(2, 0, '') ; Не удалось открыть дескриптор $aXML = _WIM_GetImageInformation($hWim) ; Чтение информации _WIM_CloseHandle($hWim) ; Закрыаем открытый дескриптор $aLabel = StringRegExp($aXML[1], "(?m)(?<=<NAME>)(.*?)(?=</NAME>)", 3) ; Вытаскиваем имя метки в тегах <NAME> If @error Then Return SetError(3, 0, '') Else $s_WIM_List = '' For $i = 0 To UBound($aLabel) - 1 $s_WIM_List &= $aLabel[$i] & '|' Next Return SetError(0, 0, StringTrimRight($s_WIM_List, 1)) EndIf EndFunc ;==>_Get_WimLabel |
Последний раз редактировалось AZJIO, 12-08-2013 в 13:13. Отправлено: 12:38, 12-08-2013 | #3 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Общее - х86 - Добавление программ в образы BOOT.WIM и WINRE.WIM | Smarty | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 150 | 14-12-2018 11:15 | |
7 / 2008 R2 - Как прописать в boot.wim новый путь к install.wim | Andorson | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 3 | 05-03-2013 11:39 | |
7 / 2008 R2 - Обновления Window 7 разных редакций в одном WIM. | hobbit25 | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 9 | 09-09-2011 20:02 | |
VBS/WSH/JS - [решено] Определение количества строк в DBF файле | xilit | Скриптовые языки администрирования Windows | 2 | 01-04-2011 22:50 | |
CMD/BAT - [решено] Определение кол-ва строчек в файле | Олег97 | Скриптовые языки администрирования Windows | 2 | 20-08-2010 09:11 |
|