Что нового

Выдергивание строк из потока и работа над ними

freed21

Новичок
Сообщения
39
Репутация
1
Добрый день, товарищи)
Пишу скрипт, который отправляет команду в консоль CMD, она её обрабатывает, и результат потоком считывается обратно в скрипт. Считывание происходит следующим образом
Код:
$sBuffer = StdoutRead($iPID)
........
$sRead &= $sBuffer

$sBuffer считывает довольно большой кусок текста, а $sRead накапливает эти куски в текст.
Нужно чтобы поток считывался не кусками а построчно, для того чтобы в обработка полученных данных шла непосредственно в процессе считывания. :scratch:
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Код:
$sBuffer = StdoutRead($iPID)
........
$sRead = StringSplit ($sBuffer,'тут разделитель',3)
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Не пойдёт.. Нужно чтобы в sBuffer попадала одна строка. А так считывается целый кусок.
Тем более, мне кажется, что потом будут проблемы со склеиванием тих кусков.
Но все равно спасибо :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
freed21 [?]
Нужно чтобы в sBuffer попадала одна строка. А так считывается целый кусок.
В любом случае будет считываться выдаваемый в поток блок, не зависящий от кол-ва в нем строк.
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Ладно.. А можно тогда задать размер считываемого блока?
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
StdoutRead ( process_id[, count[, peek = false]] )
Таки можно... :smile:
Count как раз количество считываемых символов.
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Ясно понятно :(
Спасибо за комментарии, будем думать дальше :scratch:
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
freed21
Может быть я что то недопонимаю, но почему нельзя проанализировать "завершенные" строки?

Код:
$sBuffer = StdoutRead($iPID)
$sRead &= $sBuffer

$aProcess = StringSplit($sRead,@LF)
For $Idx = 1 To $aProcess[0]-1 Step 1
    MsgBox( 0, '', 'Новая строка: ' & $aProcess[$Idx] )
Next

$sRead = $aProcess[$aProcess[0]] ;Вероятно не завершенная строка, которую пока рано обрабатывать.
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
freed21 [?]
Нужно чтобы в sBuffer попадала одна строка
А куда остальные строки девать? В принципе StringSplit делает много раз по "одна", вам решать брать одну строку, а остальное сливать мимо или брать много раз по "одна".

справка новая
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
В моем скрипте есть вызов функции tracert из CMD. В самой консоли она работает от 30 секунд до 2 минут. У меня реализовано так, что пока вся команда в консоли не отработает, информация в окне скрипта не появится, то есть пользователь будет смотреть 2 минуты на пустое окно и ждать когда же что-то появится... согласитесь, это не айс. Так вот нужно чтобы в Edit'е так же как и в консоли строка за строкой появлялась информация.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
freed21
Код:
#include <Constants.au3>
#include <WinApi.au3>
$Cmd = "tracert ya.ru"
$iPID = Run(@ComSpec & ' /C "' & $Cmd & '"', @ScriptDir, @SW_HIDE, $STDERR_MERGED)
Local $data
While 1
	$data = StdoutRead($iPID,False,False) ; Read the Stdout stream of the PID returned by Run.
	If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
		ExitLoop
	EndIf
	If $data Then
		$dataToConvert = _WinAPI_MultiByteToWideChar($data, 1, 0, True)
		ConsoleWrite($dataToConvert)
	EndIf
WEnd

Вам так нужно?
 
Верх