Что нового

Получение результатов работы DISM через StdoutRead

vovsla

Осваивающий
Сообщения
607
Репутация
36
Хотелось бы получить % выполнения который выдает DISM во время сворачивания/разворачивания образов, но стандартным образом получается выцепить только справку по команде dism.exe /?


Код:
#include <Constants.au3>
	#include <Array.au3>

;~ 	$STDOut=Run('"h:\Win8.1Upd\DISM8.1\dism_8.1_x32\dism.exe" /Mount-Image /ImageFile:"h:\Win8.1Upd\Wim\boot.wim" /Index:2 /MountDir:h:\Mount', '', @SW_HIDE, $STDOUT_CHILD)
	$STDOut=Run('"h:\Win8.1Upd\DISM8.1\dism_8.1_x32\dism.exe" /Unmount-Image /MountDir:h:\Mount /Commit', '', @SW_HIDE, $STDOUT_CHILD)
	While 1
		$STDOutR = StdoutRead($STDOut)
		If @error Then ExitLoop
		$String=StringSplit($STDOutR, @CRLF)
		_ArrayDisplay($String)
	Wend
 

ildar

Осваивающий
Сообщения
252
Репутация
29
А там есть вывод %? Не хочется снимать образ у себя для того чтобы увидеть вывод данных. Можно добавить в скрипт:
Код:
#include <Constants.au3>
    #include <Array.au3>

;~  $STDOut=Run('"h:\Win8.1Upd\DISM8.1\dism_8.1_x32\dism.exe" /Mount-Image /ImageFile:"h:\Win8.1Upd\Wim\boot.wim" /Index:2 /MountDir:h:\Mount', '', @SW_HIDE, $STDOUT_CHILD)
    $STDOut=Run('"h:\Win8.1Upd\DISM8.1\dism_8.1_x32\dism.exe" /Unmount-Image /MountDir:h:\Mount /Commit > c:\111.txt', '', @SW_HIDE, $STDOUT_CHILD)
    While 1
        $STDOutR = StdoutRead($STDOut)
        If @error Then ExitLoop
        $String=StringSplit($STDOutR, @CRLF)
        _ArrayDisplay($String)
    Wend
и содержимое или часть 111.txt файла выложить сюда. Там видно будет от чего плясать.
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
В файле остается только то что как раз и можно выцепить через StdoutRead
CЁб⥬ DISM
‚ҐабЁп: 6.3.9600.16384

Џ®¤Є«о祭ЁҐ ®Ўа §
ЋЇҐа жЁп гбЇҐи­® § ўҐа襭 .


Но в консоле есть еще информация
Cистема DISM
Версия: 6.3.9600.16384

Подключение образа
[==========================100.0%==========================]
Операция успешно завершена.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Код:
[==========================100.0%==========================]
Если цифра 100% в консоли меняется, то можно что то придумать. Если в консоли изменений нет, то отследить процесс не представляю как. В моем случае, изменений не было, пришлось вывести окно с надписью, типа "Дождитесь окончания процесса", которое по окончании сменялось "Завершено"
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
У меня % меняются и постепенно прибавляются знаки "=" как в прогресс баре.
Возможно изменений не было заметно т.к. очень маленький wim. У меня сейчас и реализовано с двумя сообщениями, но хотелось бы отловить %
 
Автор
V

vovsla

Осваивающий
Сообщения
607
Репутация
36
Что-то я не понимаю как из консоли передаются данные в GUI.
Судя по этой части примера прогресс бар создается из простого подсчета файлов.
Код:
$FileList = StringSplit(StringTrimRight($t, 2), "|")
$Archiv = @HOUR & "_" & @MIN & "_" & @SEC & "_test.zip" 

For $i = 1 To $FileList[0]
    GUICtrlSetData($Edit, @CRLF & "...compressing  " & $Folder & "\" & $FileList[$i] & "  " & $i & " of " & $FileList[0] & " ...", 1)
    ProgressSet(0, "", "Compressing " & $Folder & "\" & $FileList[$i])
    _7zRead("7z a -tzip " & $Archiv & " " & FileGetShortName($Folder & "\" & $FileList[$i]) & " -x!Thumbs.db", $Progress, 1, 1, $Label, $Folder & "\" & $FileList[$i] & "  =>  ", @SW_SHOW)
    GUICtrlSetData($Edit, " OK", 1)
Next


И в выводимом окне у меня выводится информация о том что все файлы compressing OK не смотря на то что у меня 7z в принципе нет.


Добавлено:
Сообщение автоматически объединено:

При использовании функции для моих нужд
Код:
Global Const $STD_INPUT_HANDLE = -10
Global Const $STD_OUTPUT_HANDLE = -11
Global Const $STD_ERROR_HANDLE = -12
Global Const $INVALID_HANDLE_VALUE = -1
Global Const $_CONSOLE_SCREEN_BUFFER_INFO = "short dwSizeX; short dwSizeY;short dwCursorPositionX; short dwCursorPositionY; short wAttributes;short Left; short Top; short Right; short Bottom; short dwMaximumWindowSizeX; short dwMaximumWindowSizeY"
Global Const $_COORD = "short X; short Y"
Global Const $_CHAR_INFO = "wchar UnicodeChar; short Attributes"
Global Const $_SMALL_RECT = "short Left; short Top; short Right; short Bottom"
Global Const $K32 = "Kernel32.dll", $INT = "int", $HWN = "hwnd", $PTR = "ptr", $DWO = "dword"


_7zRead('"f:\Win8.1Upd\DISM8.1\dism_8.1_x32\dism.exe" /Mount-Image /ImageFile:"f:\Win8.1Upd\Wim\boot.wim" /Index:2 /MountDir:f:\Mount')



Func _7zRead($sCmd, $iProgress="", $sProgress="", $sProgressSubText="", $iStatic="", $iStaticText="", $nShow = @SW_HIDE)
    $iPID = Run($sCmd, "", $nShow)
    ProcessWait($iPID)
    If $iStatic Then GUICtrlSetData($iStatic, $iStaticText & "0%")
    Local $hPercent = Open7ZipPercent($iPID), $opercent = -1
    While ProcessExists($iPID)
        Local $nPercent = Read7ZipPercent($hPercent)
        If $nPercent >= 0 And $opercent <> $nPercent Then
            If $sProgressSubText Then $sProgressSubText = $nPercent
            If $sProgress Then ProgressSet($nPercent, $nPercent & "%")
            If $iProgress Then GUICtrlSetData($iProgress, $nPercent)
            If $iStatic Then GUICtrlSetData($iStatic, $iStaticText & $nPercent & "%")
            $opercent = $nPercent
			ConsoleWrite($nPercent&@CRLF)
        Else
            Sleep(50)
        EndIf
    WEnd
    Close7ZipPercent($hPercent)
EndFunc   ;==>_7zRead



;internal helper functions ++++++++++++++++++++++++++++++++++++++++++++++++++++

Func Open7ZipPercent($pid)
    If _AttachConsole($pid) = 0 Then Return
    Local $vHandle[4]
    $vHandle[0] = _GetStdHandle($STD_OUTPUT_HANDLE)
    $vHandle[1] = DllStructCreate($_CONSOLE_SCREEN_BUFFER_INFO)
    $vHandle[2] = DllStructCreate("dword[4]")
    $vHandle[3] = DllStructCreate($_SMALL_RECT)
	ConsoleWrite($vHandle&@CRLF)
    Return $vHandle
EndFunc   ;==>Open7ZipPercent

Func Close7ZipPercent(ByRef $vHandle)
    If UBound($vHandle) <> 4 Then Return False
    DllCall($K32, $INT, "FreeConsole")
    $vHandle = 0
    Return True
EndFunc   ;==>Close7ZipPercent

Func Read7ZipPercent(ByRef $vHandle)
    If UBound($vHandle) = 4 Then
        Local Const $hStdOut = $vHandle[0]
        Local Const $pConsoleScreenBufferInfo = $vHandle[1]
        Local Const $pBuffer = $vHandle[2]
        Local Const $pSmallRect = $vHandle[3]
        If _GetConsoleScreenBufferInfo($hStdOut, $pConsoleScreenBufferInfo) Then
            DllStructSetData($pSmallRect, "Left", DllStructGetData($pConsoleScreenBufferInfo, "dwCursorPositionX") - 4)
            DllStructSetData($pSmallRect, "Top", DllStructGetData($pConsoleScreenBufferInfo, "dwCursorPositionY"))
            DllStructSetData($pSmallRect, "Right", DllStructGetData($pConsoleScreenBufferInfo, "dwCursorPositionX"))
            DllStructSetData($pSmallRect, "Bottom", DllStructGetData($pConsoleScreenBufferInfo, "dwCursorPositionY"))
            If _ReadConsoleOutput($hStdOut, $pBuffer, $pSmallRect) Then
                Local $sPercent = ""
                For $i = 0 To 3
                    Local $pCharInfo = DllStructCreate($_CHAR_INFO, DllStructGetPtr($pBuffer) + ($i * 4))
                    $sPercent &= DllStructGetData($pCharInfo, "UnicodeChar")
                Next
                If StringRight($sPercent, 1) = "%"  Then Return Number($sPercent)
            EndIf
        EndIf
    EndIf
    Return -1
EndFunc   ;==>Read7ZipPercent

Func _GetStdHandle($nHandle)
    Local $aRet = DllCall($K32, $HWN, "GetStdHandle", $DWO, $nHandle)
    If @error Then Return SetError(@error, @extended, $INVALID_HANDLE_VALUE)
	ConsoleWrite($aRet[0]&@CRLF)
    Return $aRet[0]
EndFunc   ;==>_GetStdHandle

Func _AttachConsole($nPid)
    Local $aRet = DllCall($K32, $INT, "AttachConsole", $DWO, $nPid)
    If @error Then Return SetError(@error, @extended, False)
	ConsoleWrite($aRet[0]&@CRLF)
    Return $aRet[0]
EndFunc   ;==>_AttachConsole

Func _GetConsoleScreenBufferInfo($hConsoleOutput, $pConsoleScreenBufferInfo)
    Local $aRet = DllCall($K32, $INT, "GetConsoleScreenBufferInfo", $HWN, $hConsoleOutput, $PTR, _SafeGetPtr($pConsoleScreenBufferInfo))
    If @error Then Return SetError(@error, @extended, False)
	ConsoleWrite($aRet[0]&@CRLF)
    Return $aRet[0]
EndFunc   ;==>_GetConsoleScreenBufferInfo

Func _ReadConsoleOutput($hConsoleOutput, $pBuffer, $pSmallRect);, 65540, 0,
    Local $aRet = DllCall($K32, $INT, "ReadConsoleOutputW", $PTR, $hConsoleOutput, $INT, _SafeGetPtr($pBuffer), $INT, 65540, $INT, 0, $PTR, _SafeGetPtr($pSmallRect))
    If @error Then SetError(@error, @extended, False)
	ConsoleWrite($aRet[0]&@CRLF)
    Return $aRet[0]
EndFunc   ;==>_ReadConsoleOutput

Func _SafeGetPtr(Const ByRef $PTR)
    Local $_ptr = DllStructGetPtr($PTR)
    If @error Then $_ptr = $PTR
	ConsoleWrite($_ptr&@CRLF)
    Return $_ptr
EndFunc   ;==>_SafeGetPtr


получил в консоле вот такие данные
1
0x0000020C
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0
0x0079E580
0


Добавлено:
Сообщение автоматически объединено:

Здесь этот вопрос решили c с помощью C++
http://www.autoitscript.com/forum/topic/123970-dism-console-progress-using-stdoutread/


Добавлено:
Сообщение автоматически объединено:

Похоже что нужно копать в эту сторону
http://msdn.microsoft.com/en-us/library/windows/desktop/hh825834.aspx
http://www.autoit.de/index.php?page=Thread&threadID=37747
 
Верх