модуль для запуска консольных программ и получения их вывода

Здесь выкладываются готовые к использованию макросы и скрипты.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by zg »

сам модуль:
execute_v2.7z
(2.32 KiB) Downloaded 542 times
пример, как можно скомпилировать программу на c++ при помощи gcc и если есть ошибки — перейти к месту их обнаружения:

 ! Message from: John Doe
Альтернативная версия модуля, с дополнительными функциями, см. тут: viewtopic.php?p=167895#p167895
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by buniak_a_h »

Latest post of the previous page:

John Doe wrote: Thu 12 Oct, 2017 19:06Это не будет работать, если предварительно не определить прототип.
Я не определял... Может, в каком-то другом макросе определяется?
Указанная последовательность у меня повешена на компилятор Харбора (язык такой, на xBase и интерпретацию заточенный...).
Код возврата анализируется; 0 - всё ок, окно компиляции закрывается. НЕ 0 - ошибка разного уровня; перехваченные сообщения об ошибках открываются в новом окне; по <Enter> происходи переход на ошибку (если файл не открыт, он открывается). Практически IDE на базе FARа. Естественно, т.к. делалось для себя, то никаких "красот" типа настроек нету. Если кого интересует - могу макрос приложить. В принципе, перенастроить его для запуска другого компилятора, наверно, несложно.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

buniak_a_h wrote: Fri 13 Oct, 2017 07:14Я не определял... Может, в каком-то другом макросе определяется?
Очевидно.
buniak_a_h wrote: Fri 13 Oct, 2017 07:14Код возврата анализируется
В вашем случае всё работает (и я подозреваю что в большинстве других случаев тоже будет), но если код возврата важен, то надо всё-таки следовать документации.
buniak_a_h wrote: Fri 13 Oct, 2017 07:14Если кого интересует - могу макрос приложить.
Если будете выкладывать, то не в этой теме.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

модуль для запуска консольных программ и получения их вывода

Post by Smitis »

John Doe wrote: Fri 13 Oct, 2017 07:05У меня ваш код работает.
Разумеется он работает, я его использую. Только строка c WaitForSingleObject у меня закомментирована. Насколько я помню, я так и не разобрался тогда, нужна ли эта проверка для консольных программ или нет.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

Code: Select all

if C.CreatePipe --...
Небольшой баг.
Функция в случае ошибки возвращает 0, который в условиях является истинным значением.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

Пытаюсь организовать не только получение вывода, но и передачу ввода, ориентируясь на пример https://docs.microsoft.com/en-us/window ... and-output


Пишется в пайп успешно, а чтение виснет (прервать можно по Ctrl-Break).
Помогите найти ошибку в коде.
Last edited by HaRT on Wed 04 Aug, 2021 17:57, edited 1 time in total.
Reason: [spoiler]
https://t.me/FarManager — Telegram чат
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

модуль для запуска консольных программ и получения их вывода

Post by HaRT »

John Doe wrote: Wed 04 Aug, 2021 16:55 Помогите найти ошибку в коде.
Не знаю, этим ли вызвано зависание, но, как я погляжу, выход из цикла происходит только при условии, что ф-я ReadFile отрапортовала, что прочитала 0 байтов. Это неправильная проверка — надо в первую очередь проверять возвращаемое значение функции (в строгом соответствии с её документацией) и, только если события развиваются по ожидаемому сценарию, проверять размер прочитанного (кстати, в случае с пайпами 0 может означать, что на стороне отправителя было записано 0 байтов).
Фар есть инструмент, а не нянька. © 2009 DrKnS
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

модуль для запуска консольных программ и получения их вывода

Post by DrKnS »

John Doe, если заказывать чтение 4096 байт, то ReadFile в синхронном режиме вернет управление тогда, когда в пайп запишут ровно 4096 байт, ну или когда его закроют (и вернет что есть).
Так как more не выходит и ждет нового ввода, управление ReadFile не вернет никогда.
Можно например, читать и обрабатывать по одному символу.
Можно работать в асинхронном режиме, но это несколько сложее.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

Упрощаю задачу, пытаюсь только передать ввод, а вывод оставить стандартный.
Но на экран ничего не выводится.
Где ошибка?
https://t.me/FarManager — Telegram чат
User avatar
citRiks
Posts: 1733
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 610 times
Been thanked: 102 times

модуль для запуска консольных программ и получения их вывода

Post by citRiks »

John Doe wrote: Wed 04 Aug, 2021 16:55 Пишется в пайп успешно, а чтение виснет (прервать можно по Ctrl-Break).
Помогите найти ошибку в коде.
в первом варианте так работает "на ура", что не отменяет странности происходящего:

Code: Select all

...
local str_output = Execute("cmd.exe /cmore", nil, "12345")
far.Show("Aaa!?!?")
far.Show("more:", str_output)
"Aaa!?!?" мы никогда не видим, зато видим нормальный вывод:
image.png
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

модуль для запуска консольных программ и получения их вывода

Post by DrKnS »

John Doe wrote: Thu 05 Aug, 2021 09:36 на экран ничего не выводится.
Где ошибка?
https://docs.microsoft.com/en-us/window ... tion-flags
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

Убрал CREATE_NO_WINDOW.

Но основная проблема никуда не делась.
Вот исходник emmet-cli
https://github.com/Delapouite/emmet-cli ... js#L29-L38

Событие stdin "end" не наступает никогда.
После запуска процесс остаётся ждать его вечно.

При этом код emmet однозначно рабочий, например echo !|emmet.cmd прекрасно работает.

Т.е. в моём коде всё ещё какая-то проблема.
https://t.me/FarManager — Telegram чат
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

модуль для запуска консольных программ и получения их вывода

Post by DrKnS »

John Doe wrote: Thu 05 Aug, 2021 12:40Событие stdin "end" не наступает никогда
https://docs.microsoft.com/en-us/window ... and-output

Code: Select all

// Ensure the write handle to the pipe for STDIN is not inherited.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

Вот такой модуль в итоге получился:
Executes specified command, putting specified text to it's input stream, and returns it's output/err Syntax: obj = sh.execute(cmdline [,options]) options: table with optional keys - directory: string - input: string - isUtf8: boolean, if true then no CP decoding performed - linewrap: number, limit line width obj: table with following keys: - all: string, all the output from executed app - blocks: function-iterator, returns the output chunk by chunk - lines: function-iterator, returns the output line by line - streamlines: function-iterator, returns the output line by line, but in stream manner: adding more data to it as it gets available. So iterator continues to return the same line (with more data) over and over, until it gets complete - and then the second `true` value is added. - ExitCode: number (from GetExitCodeProcess)
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by John Doe »

Уточнение: теперь input перекодируется в OEM.
предполагаю что это может оказаться нежелательно в некоторых случаях, но прежде чем "улучшать" хотелось бы столкнуться с реальным примером.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4234
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 642 times
Contact:

модуль для запуска консольных программ и получения их вывода

Post by buniak_a_h »

Извините меня, тупого, но у меня какой-то вопрос, и по примерам не могу найти ответ.
В старой версии модуля результат был код возврата. Теперь возвращает таблицу:
hProcess │cdata ˜ all │function ˜ lines │function
Как из неё получить код возврата? В самом модуле написано так, что для того, чтоб разобраться, надо изучать тонкости lua.
Post Reply

Return to “Полезные макросы и скрипты”