Ожидать - получение переменной из области экрана на основе строки и столбца

StackOverflow https://stackoverflow.com/questions/1988811

Вопрос

Я автоматически взаимодействую с сеансом SSH и ERP-программой, используя Expect.

Вместо того, чтобы полагаться на регулярное выражение для захвата переменной в моем ожидаемом сценарии, было бы возможно после получения определенного нажатия клавиши от пользователя преобразовать область экрана, скажем, одно поле, в переменную в коде?Отправить серверу какие-то другие команды и повторно отправить поле?

Допустим, номер заказа содержится в 6, 12, 6, 18 (где 6 - строка, а 12-18 - столбцы), содержащий мой 6-значный номер заказа.Я хочу получить этот номер заказа из столбцов строки 6 с 12 по 18, скопировав его в переменную.Затем разрешите пользователю еще немного поработать (или ожидать перехода в другое меню), затем повторно отправьте номер заказа в другом меню.

Итак, я предполагаю, что мой вопрос заключается в следующем:Находится ли содержимое текущего экрана в одном буфере?(не весь сеанс) Можете ли вы извлечь только определенный элемент данных, который существовал бы только в этом диапазоне строк и столбцов на экране?

Пример псевдокода:

#!/usr/bin/expect -f
set env(TERM) vt100
spawn ssh -Y user@domain
#... set user/pass and other vars...
#... send commands to log into ERP
#don't time out
set timeout -1 
        interact {
                -reset $CTRLZ {exec kill -STOP [pid]}
                $CTRLA   {   
                        exp_send "menu_address\ry\r"
                }
                $CTRLO   {   
                        #...acquire order number variable...
                        #...some code I don't understand yet...

                        exp_send "menu_exit_sequence\r"
                        exp_send "menu_address\r"
                        exp_send $ordernumvar

                }
                ~~
        }
Это было полезно?

Решение

Нет, вы не можете захватить что-то с экрана в определенной строке / столбце.Однако подумайте о том, как информация вообще попала на экран.Если это приложение на основе tty, использующее curses, оно было выведено в стандартный вывод со специальными escape-последовательностями, которые привели к его появлению в этой строке / столбце.Итак, "ожидайте", что эти конкретные escape-последовательности получат то, что находится в этой позиции.

Другие советы

На самом деле термин_экспектировать пример программы, которая поставляется с Expect, может сделать именно это.Он эмулирует терминал, адресуемый курсору, и позволяет вам тестировать вывод в определенных местах экрана.В моем дистрибутиве ActiveTcl он находится в demos / Expect /term_expect .

Для отладки выходных данных моей ERP-системы я обнаружил, что могу использовать эксп_интернал чтобы получить выходные символы.

exp_internal -f file 0

Результат этого дал мне:(мой введенный номер - 076338)

spawn id exp0 sent <0>^M
spawn id exp6 sent <0>^M
spawn id exp0 sent <7>^M
spawn id exp6 sent <7>^M
spawn id exp0 sent <6>^M
spawn id exp6 sent <6>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <8>^M
spawn id exp6 sent <8>^M
spawn id exp0 sent <\r>^M
spawn id exp6 sent <\r\n\u001b[1;14H>^M

Итак, теперь мне нужно вычислить регулярное выражение, чтобы получить поле.У меня было это:

-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
    set ordernumber $interact_out(0,string)
}

но теперь мне нужно включить это:

^([a-zA-Z0-9]{1})?[0-9]{5}

С некоторым регулярным выражением, которое представляло бы это:

\r\n\u001b[1;14H

И затем, как только я сохраню это в переменной $ordernumber, мне нужно каким-то образом изолировать только символы, предшествующие завершающей строке, и сохранить их в переменной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top