Чтобы справиться с этой ситуацией, вы можете использовать exp_continue
. Команда exp_continue
позволяет ожидать, что она продолжит выполнение, а не возвращение, как обычно. Это полезно для избежания явных циклов или повторных ожидающих операторов. По умолчанию exp_continue
сбрасывает таймер . Таймер не перезапускается, если exp_continue
вызывается с флагом -continue_timer
.
В expect
время ожидания по умолчанию составляет 10 секунд. то есть время, до которого expect
будет ожидать появления ожидаемой строки.
мы использовали, чтобы дать ожидаемую строку в expect
как что-то вроде
expect "name"
, который будет ждать «Имя» строки и перейти к следующему оператору, если тайм-аут произошло. Для обработки сценария тайм-аута мы используем ключевое слово timeout
в expect
.
expect {
"name" { # Some code here }
timeout { # timeout_hanlder_code_here }
}
Вы можете изменить timeout
значение с помощью set
команды, как показано ниже.
set timeout 60; # Timeout will happen after 60 seconds.
Таким образом, объединив все вместе в одном кадре,
expect {
# If the phrase 'Enter Password' seen, then it will send the password
"Enter Password" {send "yourpassword\r"}
# If 'timeout' happened, then it will send some keys &
# 'expect' will be looped again.
timeout {send -- {^[-}; exp_continue}
}
Примечание: Я вижу проблему в вашем коде. Вы упомянули, что вам нужно отправить escape + дефис. Но вы отправляете только буквенную квадратную скобку ([
) и символ дефиса (-
). Если он работает, тогда хорошо, и вам не нужно читать этот раздел «Примечание». Скачайте его. Продолжайте читать ниже.
Вы должны отправить фактический символ Escape в программу. Это может быть сделано как
send -- \033-; # Sending Escape + hyphen together
Что это \033
? Это восьмеричный код для клавиши Escape. Затем вместе с этим мы просто объединяем дефис с его символом как -
, результатом которого является \033-
. Таким образом, наш окончательный код будет,
expect {
# If the phrase 'Enter Password' seen, then it will send the password
"Enter Password" {send "yourpassword\r"}
# If 'timeout' happened, then it will send some keys &
# 'expect' will be looped again.
timeout {send -- \033-; exp_continue}
}
Ссылка: Tcl's wiki & ASCII Char Table
Спасибо Динеш нашли время, чтобы написать ответ. Я использовал autoexpect, и всякий раз, когда я вводил escape-дефис, скрипт autoexpect генерировал этот символ «^ [-». Поэтому я думал, что это должны быть персонажи. Я попробую то, что вы посоветовали, и дайте вам знать результат. – Aaron88
Это работает Динеш. Большое спасибо. – Aaron88