Автоматизация исполняемого файла в командной строке, который принимает только интерактивные аргументы (невозможно указать аргументы во время выполнения) - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть исполняемый файл, который я могу запустить в интерактивном режиме из командной строки. Вот как это выглядит:

C:\Users\Me> my_executable.exe  # Running the executable from CMD

Welcome! Please choose one:
0: Exit
1: Sub-task 1
2: Sub-task 2
Enter your input: 2             # I entered this interactively

Sub-task 2 chosen.
Please choose next option:
0: Return to previous menu
1: Connect to server
2: Disconnect from server
3: Call server API 1
4: Call server API 2
Enter your input: 1             # I entered this interactively

Я не могу указать входные аргументы заранее, используя флаги. Например, ничего подобного не работает:

C:\Users\Me> my_executable.exe 2 # Running the executable from CMD with first argument specified

Sub-task 2 chosen.
Please choose next option:
0: Return to previous menu
1: Connect to server
2: Disconnect from server
3: Call server API 1
4: Call server API 2

Enter your input: 

Каков был бы правильный способ автоматизировать это с помощью командного файла? Я столкнулся с аналогичным требованием в этом SO потоке , но разница в том, что исполняемый файл принимает аргументы командной строки (в отличие от моего случая).

1 Ответ

0 голосов
/ 09 сентября 2018

Если ваш исполняемый файл читает stdin и не имеет прямого доступа к клавиатуре, вы можете использовать перенаправление или канал для предоставления всех ответов, необходимых для завершения запуска.

Предположим, что вам нужны 2, 1 ответы, которые вы указали, но затем, после установления соединения с сервером, exe возвращается к первому меню. Предполагая, что вы хотите выйти, вам также нужно набрать 0.

Чтобы использовать перенаправление, вам необходимо подготовить текстовый файл со всеми необходимыми ответами, по одному ответу на строку.

@echo off
> response.txt (
  echo 2
  echo 1
  echo 0
)
my_executable.exe < response.txt
del response.txt

Или вы можете использовать цикл FOR

@echo off
(for %%A in (2 1 0) do echo %%A) > response.txt
my_executable.exe < response.txt
del response.txt

Вы можете избежать временного файла, если используете канал

@echo off
(
  echo 2
  echo 1
  echo 0
) | my_executable

или с петлей FOR

@echo off
(for %%A in (2 1 0) do echo %%A) | my_executable
...