Войти

Показать полную графическую версию : [решено] Определение редакций в wim файле.


dorosa
10-08-2013, 19:05
Доброго дня.
Только начинаю изучать 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

AZJIO
12-08-2013, 11:19
Вытащил код из Install_wim4.exe, страница описания и скачивания здесь (http://azjio.ucoz.ru/load/vsjo_dlja_livecd/plaginy/install_wim3/7-1-0-9)

$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, 12:38
Вот интересная WIMGAPI UDF (http://www.autoitscript.com/forum/topic/127075-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




© OSzone.net 2001-2012