MaxKozlov, вы правы, я действительно проигнорировал эти сообщения. Признаюсь, у меня было ощущение, что мой вопрос тогда был изложен несколько запутано и главное без конкретики, поэтому мне показалось, что ваш ответ не совсем к моему вопросу. Сейчас уже несколько раз перечитав понимаю, что нужно сильнее углубиться в PSReadline, так как не понимаю механизм его работы.
Но могу ли я сейчас у вас уточнить пару вещей: Я натыкался на команды позволяющие задать и посмотреть нажатия, перехватываемые PSReadline - среди них есть стрелки вверх/вниз, но нет стрелок влево/вправо. Получается, эти клавиши все же не обрабатывались PSReadline?
Второй вопрос, я удалил PSReadline - признаками этого является то, что в консоли теперь не подсказываются команды и история команд ограниченна текущей сессией работы с консолью. Но при этом история команд осталась как функция и курсор все так-же знает свои границы при вводе команды. Может быть, есть еще другой механизм перехватывающий нажатия клавиш? Может ли быть, что это уже сам терминал Microsoft не найдя PSReadline сам ограничивает курсор и ведет историю команд?
Дмитрий Беляев, я попробовал следующим образом, написал программу на Си, которая просто считывает введенные char и записывает их в файл. Выяснилось, что при нажатии например стрелки вверх записывается следующая последовательность: \x1B[A вот ровно та, что я и передаю.
Но есть еще интересный факт: если я через свою программу запускаю в powershell редактор nano, то, логично передавая в него все те же самые последовательности при нажатии стрелок, там все работает корректно. То есть при нажатии стрелки вправо курсор двигается вправо до конца с текстом и переходит вниз. То есть я не могу как угодно перемещать курсор по консоли.
То есть ситуация следующая: моя программа при нажатии стрелки вверх передает в stdin powershell core последовательность \x1B[A. Она не производит вывод предыдущей команды, а просто перемещает курсор вверх. То есть просто пересылает мои же введенные последовательности. Если же ровно в том же powershell я запущу редактор nano, то посылаемые в него последовательности \x1B[A обрабатываются уже корректно, а именно я не могу как угодно курсор перемещать.
Дмитрий Беляев, я не совсем разбираюсь в виртуальных терминалах PTY. Но фактически программа на c#, которая занимается тем, что обеспечивает передачу данных в stdin программы и выводит её stdout и stderr является виртуальным терминалом?
shurshur, я вот как раз и создаю свой псевдотерминал. Аналог терминала Microsoft если можно так сказать) Поэтому и полез внутрь его кода, чтобы понять, что он записывает в stdin по нажатию кнопок стрелок. И вот не пойму почему после ввода в stdin, этой последовательности, она эхом вывелась в stdout? Понятно, что это так и должно работать для обычных букв, но для стрелок powershell должен был вывести не эту же последовательность, а видимо стереть текущие введенные символы и вывести предыдущую команду.
Получается все введенные символы в консоли (даже без нажатия enter) заносятся в стандартный поток ввода программы. Когда мы вызываем Console.ReadLine(), то стандартный поток ввода очищается, а уже следующие введенные символы, которые заносятся в него, отправляются в стандартный поток вывода?
Понял, но смотрите, вот консоль может быть любая, как я сказал Windows Terminal или PowerShell, но они обе не позволяют вводить данные, пока они не запрошены, например с помощью Console.ReadLine(). Так, что ощущение, что какая-то обратная связь от программы к консоли все же имеется.
MaxKozlov, честно говоря я не очень понимаю в какой момент они подтягиваются, но я беру текст из стандартного потока вывода и вывожу его в свою консоль. Так-же не много поразмышляв я кажется понял, что ищу не совсем ту вещь, может мне надо знать не когда завершилась та или иная команда, а когда от меня запрощен ввод данных. По большому результат один и тот же, как только команда завершилась, происходит запрос данных. Так как это уже совсем другой вопрос, я создал его отдельно
MaxKozlov, а можете еще уточнить по поводу цветов? Runspace ведь как раз не позволяет получить цвета, а просто выдает объекты PSObject, которые при помощи ToString() преобразуются в строки, не содержащие символов форматирования.
MaxKozlov, Я может не правильно делаю, что задаю вопрос в комментариях, но фактически он относится к этому и увы новый я создать не могу, лимит закончился) Позволяет ли использование runspace получить ответ в виде строки, а не в виде коллекции объектов PSObject ? Просто хочу понять, стоит ли копать в эту сторону
Ну этот скоп команд, фактически ведь одна команда просто выполняемая в течении 10 секунд, и нужна она лишь, чтобы показать, что команда может выполняться долго и её выводит может происходить в разное время. Ведь хорошо, может быть в теории реально одна команда, но которая будет вести себя так-же, и как мне тогда понять, когда она завершилась? Я вас не очень понял, если не передавать скопом, то все же какой-то признак выводится, можете ли прояснить не много подробнее?
В любом случае при выполнении данного скопа команд в обычном Powersshell, ввод блокируется ровно до выполнения последней команды, вот именно такое поведение я и хочу сделать.
Парсить приглашение, конечно рассматривал такой вариант, но костыль как-то не красиво использовать.
И добавлю, может этот момент не совсем ясен, команды ну можно сказать будут поступать непрерывно, и от них ожидается результат. Я не много дополнил вопрос, может быть такой объяснение, более точно покажет, что я хочу сделать.
MaxKozlov,извиняюсь, все теперь понял вас. Мне на самом деле как раз нужен первый вариант. Сейчас асинхронно читаю поток побайтово, и как только что-то в него записывается я сразу это вывожу. Но проблема в том, что получив hey1, я не могу сказать будет ли за ним следовать hey2. Я же хочу, чтобы пользователь как в оригинальной консоли Powershell и терминале Windows мог вводить следующую команду, уже только когда предыдущая будет выполнена. А для этого, я должен получить видимо некоторое оповещение об этом.
Это отличный способ, который я пробовал, но есть не достаток - мне нужен именно, тот вывод, который представляет консоль PowerShell, то есть с форматированием и цветовыми кодами. Тесная интеграция с объектами PowerShell безусловно удобна, но в моем случае она не нужна.
KoreanGuy, мне нужно считать данные, который не завершены \n, а для этого потребуется Read. Извините, но я из за этого не много и возмущен, я не могу читать и ждать когда вернется 0, ведь он блокируется и ничего не возвращает, если в потоке нет данных. Даже если есть данные, то метод блокируется пока число данных не будет больше размера буфера (с нюансами, я все это описал в вопросе)
Я использовал этот метод, он отлично работает, лишь за небольшим недостатком - он не позволяет считать данные, которые не завершены символом перехода на следующую строку
Но могу ли я сейчас у вас уточнить пару вещей: Я натыкался на команды позволяющие задать и посмотреть нажатия, перехватываемые PSReadline - среди них есть стрелки вверх/вниз, но нет стрелок влево/вправо. Получается, эти клавиши все же не обрабатывались PSReadline?
Второй вопрос, я удалил PSReadline - признаками этого является то, что в консоли теперь не подсказываются команды и история команд ограниченна текущей сессией работы с консолью. Но при этом история команд осталась как функция и курсор все так-же знает свои границы при вводе команды. Может быть, есть еще другой механизм перехватывающий нажатия клавиш? Может ли быть, что это уже сам терминал Microsoft не найдя PSReadline сам ограничивает курсор и ведет историю команд?