Что нового

получение значения из cmd окна

Grizli

Новичок
Сообщения
48
Репутация
2
Здравствуйте уважаемые.
есть cmd окно
как получить значение температуры в переменную?
 

Вложения

Tempo

Скриптер
Сообщения
568
Репутация
181
Grizli, попробуйте так. Не забудьте указать путь к путь к программе и параметры запуска если они нужны

Код:
#include <AutoItConstants.au3>
Global $sExe, $sArg, $iPID, $sStdout

$sExe = ""
$sArg = ""

If $sArg Then $sExe = $sExe & " " & $sArg
OnAutoItExitRegister("_OnExit")
$iPID = Run($sExe, "", @SW_HIDE, $STDERR_MERGED)
While Sleep(10)
	$sStdout = StdoutRead($iPID)
	If @extended > 0 Then _StdoutDisplay()
	If Not ProcessExists($iPID) Then Exit
WEnd

Func _StdoutDisplay()
	Local $aRegExp = StringRegExp($sStdout, "GPU(\d+?): (\d+?)C", 3)
	If Not @error Then
		For $i = 0 To UBound($aRegExp) - 1 Step 2
			ConsoleWrite("--> GPU #" & $aRegExp[$i] & " : " & $aRegExp[$i + 1] & " C" & @CRLF)
		Next
	EndIf
EndFunc   ;==>_StdoutDisplay

Func _OnExit()
	If ProcessExists($iPID) Then ProcessClose($iPID)
EndFunc   ;==>_OnExit
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
запускается два процесса miner.exe. иногда первый pавершается с ошибкой. иногда оба работают.
в окне cmd мигает курсор и больше никакой активности.
с консоле autoit так же тишина.
вот мой вариант, но он неработоспособный. в консоль выводит только когда закрываешь окно cmd
Код:
#include <Constants.au3>

$iRun_PID = Run('C:\0.3.4b\miner.exe --config C:\0.3.4b\miner.cfg', '', @SW_MAXIMIZE, $STDERR_CHILD + $STDOUT_CHILD)

$sProcesses_List = ""

While 1
    $sProcesses_List &= StdoutRead($iRun_PID)
    If @error Then ExitLoop


$sProcesses_List = StringStripWS($sProcesses_List, 3)

ConsoleWrite( _StringOEM2ANSI($sProcesses_List))
WEnd
Func _StringOEM2ANSI($strText)
    Local $sBuffer = DllStructCreate("char[" & StringLen($strText)+1 & "]")
    Local $aRet = DllCall("User32.dll", "int", "OemToChar", "str", $strText, "ptr", DllStructGetPtr($sBuffer))

    If Not IsArray($aRet) Then Return SetError(1, 0, '') ; ошибка DLL
    If $aRet[0] = 0 Then Return SetError(2, $aRet[0], '') ; ошибка функции

    Return DllStructGetData($sBuffer, 1)
EndFunc
 

Tempo

Скриптер
Сообщения
568
Репутация
181
Выложите сюда что выводиться в консоль
Код:
#include <AutoItConstants.au3>
Global $sExe, $sArg, $iPID, $sStdout

$sExe = ""
$sArg = ""

If $sArg Then $sExe = $sExe & " " & $sArg
OnAutoItExitRegister("_OnExit")
$iPID = Run($sExe, "", @SW_HIDE, $STDERR_MERGED)
While Sleep(10)
    $sStdout = StdoutRead($iPID)
    If @extended > 0 Then _StdoutDisplay()
    If Not ProcessExists($iPID) Then Exit
WEnd

Func _StdoutDisplay()
	ConsoleWrite($sStdout)
	#cs
    Local $aRegExp = StringRegExp($sStdout, "GPU(\d+?): (\d+?)C", 3)
    If Not @error Then
        For $i = 0 To UBound($aRegExp) - 1 Step 2
            ConsoleWrite("--> GPU #" & $aRegExp[$i] & " : " & $aRegExp[$i + 1] & " C" & @CRLF)
        Next
    EndIf
	#ce
EndFunc   ;==>_StdoutDisplay

Func _OnExit()
    If ProcessExists($iPID) Then ProcessClose($iPID)
EndFunc   ;==>_OnExit
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
запускается 1 процесс miner.exe
в консоле autoit следующее:
(это две буквы F на черном фоне)
 

Вложения

Tempo

Скриптер
Сообщения
568
Репутация
181
Grizli, положите скрипт рядом с запускаемым файлом или укажите рабочую папку "C:\0.3.4b" (второй параметр Run) и попробуйте еще раз
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
положил, результат тот же- FF в консоли. если изменить строчку скрипта на
$iPID = Run($sExe, "", @SW_SHOW, $STDERR_MERGED) то при закрытии скрипта в консоль выводится весь вывод окна cmd за все время работы, как и в моей версии скрипта.
и так же вначале FF
 

Вложения

Tempo

Скриптер
Сообщения
568
Репутация
181
Думаю проблема в самой утилите

Можете посмотреть как это работает с ping
Код:
#include <AutoItConstants.au3>
Global $sExe, $sArg, $sWorkingDir, $iPID, $sStdout

$sExe = "ping.exe"
$sArg = "-t 8.8.8.8"
$sWorkingDir = ""

If $sArg Then $sExe = $sExe & " " & $sArg
OnAutoItExitRegister("_OnExit")
$iPID = Run($sExe, $sWorkingDir, @SW_SHOW, $STDIN_CHILD + $STDERR_MERGED)
While Sleep(10)
    $sStdout = StdoutRead($iPID)
    If @extended > 0 Then _StdoutDisplay()
    If Not ProcessExists($iPID) Then Exit
WEnd

Func _StdoutDisplay()
	ConsoleWrite($sStdout)
	#cs
    Local $aRegExp = StringRegExp($sStdout, "GPU(\d+?): (\d+?)C", 3)
    If Not @error Then
        For $i = 0 To UBound($aRegExp) - 1 Step 2
            ConsoleWrite("--> GPU #" & $aRegExp[$i] & " : " & $aRegExp[$i + 1] & " C" & @CRLF)
        Next
    EndIf
	#ce
EndFunc   ;==>_StdoutDisplay

Func _OnExit()
    If ProcessExists($iPID) Then ProcessClose($iPID)
EndFunc   ;==>_OnExit
 
Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
да, вы правы, с pingom все отлично


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

попытался извлечь нужные данные из cmd посредством cheat engine, толи масла в голове не хватило, толи они не извлекаются.....
у моего работающего майнера из cmd есть прикрученный API на http://127.0.0.1:42000/
может можно посредством запроса к API получать температуры?
 

Вложения

Автор
G

Grizli

Новичок
Сообщения
48
Репутация
2
Код:
$ret = InetRead("http://127.0.0.1:42000/")
$ret=BinaryToString ($ret)
$ret=StringTrimLeft($ret, StringInStr ($ret,"gpu0"))
$ret=StringTrimLeft($ret, StringInStr ($ret,">",0,4))
$temp=StringTrimRight($ret,StringLen($ret)-2)
ConsoleWrite($temp&@CRLF)
While StringInStr ($ret,"gpu")
$ret=StringTrimLeft($ret, StringInStr ($ret,">",0,16))
$temp=StringTrimRight($ret,StringLen($ret)-2)

ConsoleWrite($temp&@CRLF)

WEnd

вопрос решен
 
Верх