Автоматизация ответов на программу командной строки в пакетном файле - PullRequest
0 голосов
/ 03 ноября 2011

Я пытаюсь запустить программу командной строки Windows (XP), которая запрашивает «Enter» или «y» для продолжения. В настоящее время я могу ответить на 'y's, запустив программу как: echo y | name_of_binary в командном файле.

Я не могу понять, как сказать оболочке отвечать 'Enter' или 'y', когда это требуется. Если он получает запрос типа «Нажмите Enter для продолжения» (которого не так много, но достаточно, чтобы вызвать проблемы) и повторяет «y», он застревает в странном цикле и не принимает никаких входных данных ( он извергает тысячи «нажмите ввод, чтобы продолжить). Если бы я мог повторить сначала Enter, а затем 'y' в последовательности, это могло бы сработать, но ни один из методов, которые я пытался отразить нажатием клавиши Enter, не сработал.

В конечном итоге я вызываю этот пакетный файл через os.system() в Python. Если есть способ заставить Python запускать двоичный файл (через os.system (name_of_binary)?) И ​​отвечать на запросы, это было бы идеально. Я уже пробовал os.system(echo y | name_of_binary), который вел себя так же, как командный файл (как и должно быть). Должен ли я использовать другой подход, или я могу решить эту проблему, изменив команду 'echo ...', которую я сейчас использую?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Стандартный способ вывода Enter в пакетном режиме - echo/ в строке без дополнительных пробелов.Чтобы вывести Enter, за которым следует 'Y', вы можете попробовать это: (echo/&echo Y) | name_of_binary (не вставляйте пробелы в echo/&).

Если это не сработает, будет потому, что символы LineFeed, которые вставляются послепервый Enter и после Y. Точная последовательность байтов, сгенерированных (echo/&echo Y): CrLfYCrLf, где Cr - возврат каретки, а Lf - перевод строки.

Если у предыдущего метода возникли проблемы, выможет создать файл с CrY байтами с помощью этого командного файла:

@echo off
echo/> EnterY.txt
(
echo e101
echo 59
echo w
echo q
) | debug EnterY.txt > nul

и затем выполнить вашу команду следующим образом: name_of_binary < EnterY.txt.

PS - Обратите внимание, что echo y | name_of_binaryгенерировать y CrLf, то есть пробел после y;это должно быть echo y| name_of_binary.

0 голосов
/ 03 ноября 2011

Оформить Ожидайте для Windows .

Это все, что вам нужно.Есть несколько книг по Expect и множество учебных пособий (включая образцы).Ваш любимый поисковик - ваш лучший друг, но приведенный выше URL-адрес сайта Activestate содержит все, что вам нужно.В то время как то, что вы можете найти в учебниках и книгах, может быть ориентировано на Unix, откуда и ожидалось, ожидание Windows не слишком отличается.

Expect позволит вам автоматизировать взаимодействие с командной строкой внутри пакетаскрипты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...