Я сделал несколько примеров, которые не содержат ничего лишнего, чтобы более точно описать мой вопрос. Все программы запускаются на 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.