@Quttar72
Изучаю asp.net core mvc

Почему powershell не реагирует на коды клавиш стрелок?

Я сделал несколько примеров, которые не содержат ничего лишнего, чтобы более точно описать мой вопрос. Все программы запускаются на Windows.

Следующая программа запускает Powershell, и как я понимаю запускает консоль, стандартные потоки, которой соединены со стандартными потоками запущенного процесса. В результате я могу пользоваться всеми возможностями powershell. Особенно хочу отметить следующие: по нажатию стрелок вверх/вниз я переключаюсь по истории команд и по нажатию стрелок влево/вправо происходит перемещение курсора, но лишь в пределах вводимой команды - курсор не выходит на промпт и за саму команду.
static void Main(string[] args)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = @"C:\Users\raffl\AppData\Local\Microsoft\WindowsApps\pwsh.exe";
    startInfo.RedirectStandardInput = false;
    startInfo.RedirectStandardOutput = false;
    startInfo.RedirectStandardError = false;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = false;

    var shellProcess = new Process();
    shellProcess.StartInfo = startInfo;
    shellProcess.Start();
}


Теперь я сделаю следующее, я сам буду вводить данные в поток stdin процесса powershell, а не через консоль. Потоки stdout и stderr остаются направлены на консоль.
static void Main(string[] args)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = @"C:\Users\raffl\AppData\Local\Microsoft\WindowsApps\pwsh.exe";
    startInfo.RedirectStandardInput = true;
    startInfo.RedirectStandardOutput = false;
    startInfo.RedirectStandardError = false;
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = false;

    var shellProcess = new Process();
    shellProcess.StartInfo = startInfo;
    shellProcess.Start();

    shellProcess.StandardInput.Write("Write-Host hey1\r\n");
    shellProcess.StandardInput.Write("Write-Host hey2\r\n");
    shellProcess.StandardInput.Write("\x1b[A");

    Console.Read();
}


После выполнения этого кода, корректно выводятся сообщения hey1 и hey2, но вот после ввода последовательности стрелки вверх курсор только поднимается вверх, а не происходит переключение по истории команд. То же самое касается других стрелок, они производят перемещение курсора в соответствующем направлении, причем стрелки влево и вправо делают это без ограничений.

Покопав код Microsoft Terminal, я нашел какие последовательности они используют при нажатии стрелки вверх: \x1b[A, \x1bOA, \033A, \x1b[1;1A Я пробовал их, но одни ничего не делают, другие производят поднятие курсора вверх.

У меня есть ощущение, что я должен переключить Powershell в какой-то режим, чтобы он воспринимал эти последовательности, может ли кто подсказать, каким образом это можно решить?

Отмечу еще один интересный момент, который я обнаружил. Если открыть консоль Bash, которая устанавливается вместе с Git на Windows, и там запустить powershell, то наблюдается точно такое же поведение. С другой стороны, в терминале Microsoft все работает корректно, хотя он фактически из информации имеет тоже только путь до исполняемого файла powershell.
  • Вопрос задан
  • 258 просмотров
Пригласить эксперта
Ответы на вопрос 1
@MaxKozlov Куратор тега PowerShell
Это статейка про консоль, в которой объясняется что да как (там серия)

Introducing the Windows Pseudo Console (ConPTY)

А это пример самописного терминала, который таки реагирует на стрелку вверх 0x1b[A так, как вам бы хотелось, при отключении PSReadline
Правда у него чуть другая проблема - на цвета не реагирует :) 0x1b[XXXXXm
Описание (соседние примеры тоже полезны)
Исходники
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы