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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Определение редакций в wim файле. (http://forum.oszone.net/showthread.php?t=265924)

dorosa 10-08-2013 19:05 2199579

Определение редакций в wim файле.
 
Доброго дня.
Только начинаю изучать 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 2200233

Вытащил код из 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 12:38 2200259

Вот интересная 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



Время: 09:52.

Время: 09:52.
© OSzone.net 2001-