Что нового

Перехват данных из cmd и вывод в своё GUI или в txt

rpgeha

Новичок
Сообщения
11
Репутация
0
Всем привет. Есть программа - майнер "MinerGate-cli-4.04-win32", она запускается бат файлом с указание параметров. Мне нужно как-то логировать её работу.

Это содержимое бат файла для запуска майнера.
Код:
minergate-cli.exe -user [email protected] -xmr 2
После запуска батника происходит запуск майнера, появляется консоль и далее в ней выводится информация. Информация выводится динамически, почти каждую секунду новая строка.

Как сделать так, чтобы то что выводится в cmd перенаправлялось в перемененную autoit или записывалось сразу в txt?

Пробовал реализовать при помощи таких команд:

Код:
$MinerStart =  Run(@ComSpec & 'MinerGate-cli-4.04-win32.exe -user [email protected] -xmr 2','' , @SW_HIDE, $STDERR_MERGED)
ConsoleWrite(StdoutRead($MinerStart))


StdoutRead почему-то возвращает - ничего. Весь день пробую различные вариации, но никак не могу выхватить этот текст из cmd(

Нашел код на форуме с похожей проблемой и тоже про майнер, пробовал через него перехватить, но все равно тщетно.
Код:
;#Include <Update_Ex.au3>
#include <Date.au3>
;#include <IE_new.au3>
#Include <WinAPIEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <String.au3>
#Include <WinAPI.au3>
#include <array.au3>
#include <Misc.au3>
#include <ButtonConstants.au3>
#include <WindowsConstants.au3>
#include <GuiToolbar.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstants.au3>
#Include <GUIEdit.au3>
#Include <GUISlider.au3>
#Include <File.au3>
#include <Constants.au3>
#include <ComboConstants.au3>
#include <TabConstants.au3>
#include <MenuConstants.au3>
#include <Encoding.au3>
#include <Process.au3>
#RequireAdmin
;FileChangeDir(@HomeDrive & "\cgminer")
;Авто Обновление
$Current_Version = "1.1.6"
;_StartCheckForUpdate("url",$Current_Version,True)
;~ Конец автообновления
Global $wintitle = "[CLASS:ConsoleWindowClass]", $fInterrupt = 0, $Log, $CountWile = 0

;################################ ГУИ #############################
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("MineController - " & $Current_Version, 653, 392, Default, Default)
GUISetBkColor(0x808080)
$Label2 = GUICtrlCreateLabel("Информация", 9, 8, 75, 19)
GUICtrlSetColor(-1, 0xFFFFFF)
$InfoD = GUICtrlCreateEdit("", 8, 26, 633, 70, BitOR($ES_READONLY,$ES_WANTRETURN,$WS_BORDER), 0)
$Label1 = GUICtrlCreateLabel("Основные Действия", 9, 105, 112, 19)
GUICtrlSetColor(-1, 0xFFFFFF)
$Edit1 = GUICtrlCreateEdit("", 8, 122, 633, 70, $ES_READONLY)
GUICtrlSetData(-1, "Программа запущена")
$Group1 = GUICtrlCreateGroup(" Лог ", 8, 200, 633, 185, BitOR($ES_READONLY,$GUI_SS_DEFAULT_GROUP,$WS_CLIPSIBLINGS))
GUICtrlSetColor(-1, 0xFFFFFF)
$Edith = GUICtrlCreateEdit("", 16, 217, 617, 158, BitOR($ES_READONLY,$ES_AUTOVSCROLL,$WS_VSCROLL,$ES_NOHIDESEL,$ES_WANTRETURN))
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
;_конец ГУИ



$MinerStart =  Run(@ComSpec & 'minergate-cli -user [email protected] -xmr 2','' , @SW_HIDE, $STDERR_MERGED)

While 1
_ReadCMData ($MinerStart)
    $nMsg = GUIGetMsg()
    Switch $nMsg
 Case $GUI_EVENT_CLOSE
            Exit
           EndSwitch
Sleep(100)
WEnd

;###################################### Функции ######################################

 ;*=============================================== Считывание данных
Func _ReadCMData ($target)
If $fInterrupt <> 0 Then Return
Local $data = ''
   $data &= StdoutRead($target)
          If @error Then Return
        Sleep(10)
 if $data <> "" Then
    _Added($Edith, _Encoding_OEM2ANSI($data), 150)

 EndIf
EndFunc


 ;*=============================================== Запись действий
Func _Added($iEdit, $sNewString, $iK)
    GUICtrlSetData($Edith, $sNewString & @CRLF & StringRegExpReplace(GUICtrlRead($Edith), '(?s)((?:.*?\r\n){'&$iK&'})(.*)', '\1'))
EndFunc

  ;*=============================================== SLEEP
  Func _SleepEx($iDelay) ;~ Sleep модификация
       If $fInterrupt <> 0 Then Return True
    Local $iBegin = TimerInit()
    Do
        Sleep(50)
        If $fInterrupt Then
            Return True
        EndIf
    Until TimerDiff($iBegin) > $iDelay
    Return False
 EndFunc

 ;*=============================================== Выход
Func WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nID = BitAND($wParam, 0xFFFF)
    If $nID == $SC_CLOSE Then
        If ProcessExists("minergate-cli") Then ProcessClose("minergate-cli")
ProcessWaitClose ("minergate-cli")
               WinClose($wintitle)
Exit
EndIf
Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SYSCOMMAND

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
Switch $hWnd
   Case $wintitle
    Switch $nNotifyCode
        Case $BN_CLICKED
            Switch $nID
                Case $SendButton
$fInterrupt = 1
               EndSwitch
    EndSwitch
EndSwitch
    Return $GUI_RUNDEFMSG
 EndFunc   ;==>WM_COMMAND

В чем может быть проблема, что читать, где копать? Подскажите пожалуйста
 

vovsla

Осваивающий
Сообщения
546
Репутация
26
Попробуй так

Код:
$STDOut=Run('MinerGate-cli-4.04-win32.exe -user [email protected] -xmr 2', '', @SW_HIDE, $STDOUT_CHILD)
	While 1
		$STDOutResult = StdoutRead($STDOut)
		If @error Then ExitLoop
		If $STDOutResult<>'' Then ConsoleWrite($STDOutResult&@CRLF)
	Wend
 
Автор
R

rpgeha

Новичок
Сообщения
11
Репутация
0
Vovsla сказал(а):
Попробуй так

Код:
$STDOut=Run('MinerGate-cli-4.04-win32.exe -user [email protected] -xmr 2', '', @SW_HIDE, $STDOUT_CHILD)
	While 1
		$STDOutResult = StdoutRead($STDOut)
		If @error Then ExitLoop
		If $STDOutResult<>'' Then ConsoleWrite($STDOutResult&@CRLF)
	Wend
Результат - майнер запускается (в процессах начинает висеть), autoit скрипт висит в трее, но в консоли пусто, ничего не выводит.

">Exit code: 0 Time: 3.924"
 
Автор
R

rpgeha

Новичок
Сообщения
11
Репутация
0
Сообщения
80
Репутация
-1
Похоже проблема не решаема в принципе, в линуксе её просто нет.
cmd не позволяет выводить на несколько устройств, причём вывод на экран динамический в реальном времени, а вывод в лог только по завершению процесса, который бесконечен.
Если вывод в лог в программе не прописан, то его и не сделать.

Возможно можно найти решения ковыряя исходники cmd от wine и reactos, вполне сгодится версия 32.
Можно попробовать задействовать какойто виндовый баш, но в отличии от линукса. у винды очень слабый функционал, и скорее всего фич линукса просто нет.

Копал тему ещё в году 2016, смотрю решений всё ещё нет.

Есть экзотические программы.
avrdude программа не бесконечного цикла, но с несколькими шагами.
В процессе шага пишет полоску статуса в реальном времени и если зависнет это положение видно.
При выводе в лог, записывает только шагами, и полоску статуса пишет только как 100% при успешном прохождении или не пишет вообще если зависло гдето в середине.

dstm майнер, программа бесконечного цикла, при направлении в лог дописывает строки, но последовательно и как следствие не верно.
В реальном времени изменяет любые строки на экране, чего при выводе в лог сделать нельзя.
Но в этой программе автор сделал возможность вывода в лог и в этом файле как раз переписываются ранее написаные строки, получается как и на экране. Силами вендовой консоли подобное сделать нельзя.

Так что лучшее что можно сделать через скрипт это прикрепить кнопки к консольному окну
 
Верх