Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2016, 17:10   #1
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию Как общаться с консольным приложением через пакетный файл?

Всем здравствуйте!
Помогите, пожалуйста, разобраться в таком ретро-вопросе.
Имеется консольное приложение (шахматный движок), написанное не знаю на каком языке, но это к делу не относится. В среде MS-DOS точно не запустится, потому что в хедере указано "This program cannot be run in DOS mode". Следовательно, запускаем его в Windos XP из Тотал Командера. Появляется консольное окошко, в котором мы можем вводить "внутренние команды", которые понимает только это приложение. Понятно я объясняю? Одним словом в самом MS-DOS таких команд нет. Например, команда "go" приказывает движку начать просчитывать варианты. Вот допустим, сейчас я запустил это приложение и (вручную) скомандовал "go". Приложение мне отвечает вот так:



В первой строке название движка и авторы, во второй команда "go", ну а дальше результат этой команды. В данном случае движок, как я понимаю, взял настройки по умолчанию, просчитал варианты на 10 полуходов вперед из начальной шахматной позиции и выдал лучший, по его мнению, ход Кg1-f3. Чтобы изменить настройки этого движка (позицию на доске, глубину просчета вариантов и т.п.) имеются такие же "внутренние команды", которые сначала надо ввести, а потом уже скомандовать "go".
Разумеется, в наше просвещенное время таким презренным ручным трудом можно не заниматься. Достаточно взять любую шахматную оболочку с графическим интерфейсом, подключить к ней этот движок и дело сделано. Но мне все-таки хочется именно в таком консольном варианте этот движок поюзать, а следовательно, для автоматизации труда сам собой напрашивается пакетный файл или VB скрипт. Но скриптами я уже давно не занимался, потому-то и пишу не на основном форуме, а здесь. Одним словом, для начала хотелось бы именно с помощью пакетника это дело автоматизировать. Изменяем (редактируем) в пакетнике настройки и запускаем его на исполнение.
И вот тут я сталкиваюсь с такой проблемой: запустив это приложение из пакетника,

Код:
c:\proba\stockfish_7_32bit.exe
go
pause
виртуальная машина DOS не отдает ему управление. Иными словами, все "внутренние команды" этому приложению она рассматривает как команды себе самой, а поскольку она их не понимает, то и пишет: «Unknown command».



Попробовал вставить "go" как параметр команды запуска этого приложения, то есть вот так:

Код:
call c:\proba\stockfish_7_32bit.exe go
pause
Сработало. В результате на экране вот такая картинка:



Казалось бы, решение найдено. Просто вставляй (через пробелы) все "внутренние команды" в качестве параметров в первой же строке пакетника и дело в шляпе:

Код:
call c:\proba\stockfish_7_32bit.exe <команда 1> <команда 2> <команда 3> ...
pause
Но не тут-то было. Воспринимается только первый такой «параметр», а все остальные игнорируются. Я здесь немного поэкспериментировал на эту тему и пришел именно к такому (ошибочному?) выводу.
Одним словом, подскажите, пожалуйста, каким образом можно составить пакетник (или Vb скрипт), чтобы можно было его слегка редактировать и запускать это приложение с разными начальными настройками, передавая их в качестве отдельных строк скрипта (это в идеале), либо в качестве параметров (неудобно, громоздко, но если это единственно возможный вариант, то можно потерпеть).
Олег* вне форума Ответить с цитированием
Старый 19.02.2016, 17:29   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Непонятно зачем аж целый абзац об MS-DOS, первый раз консольное приложение увидели? Они и в MS Win10 популярность не утратили и никакая "виртуальная машина DOS" не нужна (если это не 16-битное приложение из тех времен, но в данном случае приложение явно не древнее и никакого DOS не застало и не поддерживает https://en.wikipedia.org/wiki/Stockfish_%28chess%29).
И тотал коммандер тоже совсем не обязателен для их запуска.

Я б AutoIt или AutoHotkey использовал если нужна просто автоматизация, там простые и удобные функции для ввода в stdin и т.п. http://autoit-script.ru/autoit3_docs...Management.htm

Или может там вообще API предоставлено? Не очень понимаю что такое "шахматный движок" и что эта программа делает.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.02.2016 в 17:38.
Alex11223 вне форума Ответить с цитированием
Старый 19.02.2016, 17:41   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как вариант еще можно написать команды в файл и направить их приложению.
app<<commands.txt
поидее должно отработать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.02.2016, 18:02   #4
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от Олег* Посмотреть сообщение
Но не тут-то было. Воспринимается только первый такой «параметр», а все остальные игнорируются. Я здесь немного поэкспериментировал на эту тему и пришел именно к такому (ошибочному?) выводу.
UCI предписывает игнорировать всё начиная с первой ошибки в команде. Если вы передадите команду go stop, она будет урезана до go.

Но мне больше интересно, как вы собрались играть скриптом против недетерменированной программы. А вообще, играть с движком без оболочки - это как программировать в ed. Если вы играете на деревянной доске или вслепую и хотите консольный интерфейс, поставьте лучше GNU Chess. Upd: ошибочка, gnuchess не работает как консольный интерфейс для других движков. Короче, вам нужен человеческий шахматный интерфейс.

Последний раз редактировалось ds.Dante; 19.02.2016 в 18:42.
ds.Dante вне форума Ответить с цитированием
Старый 19.02.2016, 18:15   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Воспринимается только первый такой «параметр», а все остальные игнорируются.
Не знаю как в этом, конкретном движке сделано, но последовательность команд (обычно) задаётся через слешь.
Код:
call c:\proba\stockfish_7_32bit.exe <команда 1>\<команда 2>\<команда 3>...
Это общепринятое негласное правило передачи команд в консольных приложениях. Нигде оно не задокументировано, просто традиционно так сложилось.

Цитата:
Не очень понимаю что такое "шахматный движок" и что эта программа делает.
Собственно, это класс скомпилированный в экзешник. С API через строку. Он служит для расчёта ходов. При этом программисту остаётся только прикрутить к нему графическую оболочку.
Интересность такого решения в том, что можно на его основе, наштамповать множество визуальных отображений, под разные вкусы потребителей, не меняя сути самой игры.

Да, ещё вспомнил. Попробуйте ввести команду "?". Должна выдать список доступных команд и их форматы.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 19.02.2016 в 18:32.
Smitt&Wesson вне форума Ответить с цитированием
Старый 19.02.2016, 18:30   #6
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от Олег* Посмотреть сообщение
Всем здравствуйте!
Помогите, пожалуйста, разобраться в таком ретро-вопросе.
Фига се ретро вопрос Да это же Stockfish — открытый UCI-совместимый шахматный движок, один из сильнейших в мире.
Поддерживает 32-битный и 64-битный однопроцессорный и многопроцессорный режимы (вплоть до 128 ядер), различные настольные и мобильные платформы (Windows, Mac OS X, Linux, iOS, Android)
Для того, что бы разобраться с ним надо изучить протокол UCI и настройки этого движка
kvitaliy вне форума Ответить с цитированием
Старый 19.02.2016, 18:36   #7
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Цитата:
Сообщение от kvitaliy Посмотреть сообщение
один из сильнейших в мире
Позвольте поправить: сильнейший в мире.
ds.Dante вне форума Ответить с цитированием
Старый 19.02.2016, 18:37   #8
Олег*
Пользователь
 
Регистрация: 07.01.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Непонятно зачем аж целый абзац об MS-DOS, первый раз консольное приложение увидели? .
Да нет, не первый, конечно, но и большого опыта работы с ними у меня нет. А рассказал все так подробно и многословно, чтобы постараться сразу объяснить все подробности в одном посте. Мне надо было объяснить, что именно я понимаю под моим собственным термином «внутренние команды». Возможно для этого есть какой-то другой специальный термин, но я его не знаю.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Они и в MS Win10 популярность не утратили и никакая "виртуальная машина DOS" не нужна (если это не 16-битное приложение из тех времен, но в данном случае приложение явно не древнее и никакого DOS не застало и не поддерживает https://en.wikipedia.org/wiki/Stockfish_%28chess%29). .
Ну да, это один из последних сильнейших движков, разработанных относительно недавно.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И тотал коммандер тоже совсем не обязателен для их запуска.
Да это я понимаю, что Тотал для запуска программ не обязателен. Просто я всегда все программы запускаю именно из него, мне так удобно.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я б AutoIt или AutoHotkey использовал если нужна просто автоматизация, там простые и удобные функции для ввода в stdin и т.п. http://autoit-script.ru/autoit3_docs...Management.htm .
Посмотрел по ссылке. Никогда с этими программами дела не имел. Честно говоря, не хотелось бы сейчас изучать что-то новое, если есть способы использовать то, с чем уже когда-то хотя бы немного имел дело (пакетники и VB скрипты). Но если это единственный способ решить возникшую проблему, тогда да, придется это делать.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Или может там вообще API предоставлено? .
Не знаю. Я внутри этого кода не ковырялся. Честно говоря, вообще внутрь чужих программ уже несколько лет не залазил.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Не очень понимаю что такое "шахматный движок" и что эта программа делает.
Вот здесь об этом рассказано популярно и достаточно подробно: http://kvetka.org/UCI_format.shtml#setoption
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
как вариант еще можно написать команды в файл и направить их приложению.
app<<commands.txt
поидее должно отработать.
Сейчас попробовал поступить подобным образом.
Файл commands.txt у меня сначала выглядел вот так:
Код:
go
Запускал движок вот так:
Цитата:
c:\proba\stockfish_7_32bit.exe c:\proba\commands.txt
двумя способами:
1. Из Тотал Командера,
2. С помощью Пуск > Выполнить…
В обоих случаях консольное окно вспыхивает и сразу же пропадает (закрывается).
Попробовал переписать текстовый файл вот таким образом:
Код:
 go
pause
Результат тот же самый: окно появляется на одно мгновение и сразу же пропадает.
Правильно я понял, что у Вас знак «<<» означает пробел? Если да, то я так и делал.
На самом деле, это очень интересная возможность, про которую я не знал, - передавать в качестве параметра текстовый файл с командами. Жаль, что невозможно увидеть результат
Олег* вне форума Ответить с цитированием
Старый 19.02.2016, 18:52   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

<< означает просто <<, а не пробел.
Только разве не одно < надо вместо двух?
https://www.microsoft.com/resources/....mspx?mfr=true

Цитата:
2. С помощью Пуск > Выполнить…
cmd откройте и в нем выполняйте. В вин 8+ даже есть кнопка в Проводнике для открытия cmd в текущей папке.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.02.2016, 18:54   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
<< означает просто <<, а не пробел.
Только разве не одно < надо вместо двух?
https://www.microsoft.com/resources/....mspx?mfr=true
Один знак < означает "меньше". Два << означает включение в поток (это в Си).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь с консольным приложением VB Мария студентка Помощь студентам 3 03.12.2014 20:17
Работа с консольным приложением в Pascal djquins Помощь студентам 1 15.12.2013 16:04
Взаимодействие с консольным приложением RADEM C# (си шарп) 3 29.04.2013 21:59
работа с консольным java приложением (win32) D][mon C# (си шарп) 1 11.02.2012 14:30
Работа со сторонним консольным приложением Recart Общие вопросы Delphi 3 01.12.2010 01:22