Что нового

[Процессы] Взаимодействие с консолью: как прочитать из консоли и записать в неё?

motoroler

Чайник
Сообщения
4
Репутация
0
Привет форумчане!
помогите разобраться, как наладить взаимодействие с консолью? Для примера, ниже, запускаю консоль, в ней печатаю содержимое каталога. Как это содержимое перехватить и выдать в диалоговом окне? Вот скрипт
Код:
#include <Constants.au3>
Dim $pid
Dim $cons_string
Dim $proc_name
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$pid = Run(@ComSpec & " /k dir", @SystemDir, $STDERR_CHILD + $STDOUT_CHILD) 
$proc_name = _ProcessGetName($pid)
if @error Then
   MsgBox(0, 'Error', "")
Else
   $cons_string = StdoutRead($pid)
   MsgBox(0,"Read bytes", "Bytes = " &  @extended)
   MsgBox(0,"$cons_string", "$cons_string = " & $cons_string)

EndIf


Почему читается 0 байт?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
motoroler сказал(а):
Почему читается 0 байт?
Не успел считать :smile:
Дай ему время чтобы вывалить инфу. Вот скрипт, все нормально кажет
Код:
#include <Constants.au3>
Dim $pid
Dim $cons_string
Dim $proc_name
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
$pid = Run(@ComSpec & " /k dir", @SystemDir, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
While 1
    $cons_string = StdoutRead($pid)
    $a = @extended
    $ind = @error
    Sleep(500)
    If $ind Then ExitLoop
    If $a <> 0 Then
        MsgBox(0, '', 'Bytes = ' & $a)
        MsgBox(0, "STDOUT read:", $cons_string)
    EndIf
Wend
 
Автор
M

motoroler

Чайник
Сообщения
4
Репутация
0
kaster сказал(а):
motoroler сказал(а):
Почему читается 0 байт?
Не успел считать :smile:
Дай ему время чтобы вывалить инфу.
Спасибо большое за быстрый и верный ответ!! :laugh:
Код выше действительно работает, НО! - оказывается мне не хватало лишь макроса @SW_HIDE,

Вот скрипт, все нормально кажет
Код:
$pid = Run(@ComSpec & " /k dir", @SystemDir, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
если в приведенном выше коде убрать
Код:
sleep(500)
но оставить @SW_HIDE, то все будет работать!

Я думал, что этот макрос влияет лишь на сокрытие окна, но никак не на очистку буфера (или как это правильно называется?). Это баг или фича? ;)
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
хм... у меня например если убрать слип, вываливает лишь часть инфы на первом проходе, и вторая часть на втором. а макрос я поставил просто чтобы не видеть окно консоли.
можешь поставить @SW_SHOW, тоже все будет норм.

макрос @SW_HIDE не влияет на буфер, так что это и не баг и не фича.
 
Автор
M

motoroler

Чайник
Сообщения
4
Репутация
0
только что проверил - если стоит любой из макросов @SW_HIDE/@SW_SHOW, то скрипт выводит содержимое каталога полностью и одинаково что с sleep(500), что без sleep'a. НО вот если запустить скрипт БЕЗ этих макросов, то стоит sleep, или его нет - всё равно скрипт ничего не выводит. Попробуй, плиз, запусти у себя этот пример с sleep'oм, но без макросов @SW_HIDE/@SW_SHOW, т.е. со строчкой

Код:
$pid = Run(@ComSpec & " /k dir", @SystemDir, @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)

какой результат? :blink:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
ну это означает, что твоя тачка достаточно мощная и/или содержимое системного каталога не такое большое как у меня. слип я ставлю исключительно для этого.
а в твоем случае, если убрать флаг показа/сокрытия окна, то ничего не показывается не из-за этого, а из-за того, что вместо этого самого флага ты ставишь непонятные компилятору именно в этом месте константы $STDOUT_CHILD и $STDERR_CHILD
если не хочешь применять какие-нибудь параметры (принять их за дефолтные) но при этом желаешь перечислить остальные, то нужно указывать в вызове функции дефолты - для чисел это как правило - 0, а для строковых переменных - "".
то есть если ты хочешь запустить вышеназванный скрипт но без флагов, то ставь в соответствующем месте - 0 (это будет аналогично применению макроса @SW_HIDE - он по дефолту)
 
Автор
M

motoroler

Чайник
Сообщения
4
Репутация
0
ок, понял :smile:
попробовал сделать скрипт более полезным - автоматизировать взаимодействие через telnet и столкнулся с следующим: строчка
Код:
$pid = Run(@ComSpec & " /k telnet 192.168.0.1", "", @SW_SHOW,  $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)

открывает чёрное окно и закрывает его тут же! Никакого приглашения ввести имя пользователя не появляется (IP здесь я изменил, заход по реальному выдаёт приглашение). В чём может быть проблема? Слышал где-то что Microsoft telnet не работает с STDI/O ? Это так?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
motoroler сказал(а):
Слышал где-то что Microsoft telnet не работает с STDI/O ? Это так?
возможно и так. потому как вывод в файл тоже не работает с телнетом.
 
Верх