Я написал ssh-сервер в С#, и я подумал, что было бы удобно подключать powershell как оболочку. Я пробовал 2 метода, чтобы заставить это работать правильно, но оба они далеки от совершенства. Вот что я пробовал:
- Запустите powershell.exe и перенаправьте его std (in/out). Это не хорошо работает, так как powershell.exe обнаруживает, что он перенаправлен, изменения это поведение. Что еще, он ожидает ввода данных на stdid, а не команды. Поэтому он использует консоль api для чтения команд.
- Host powershell в приложении "wrapper". Это имеет то преимущество, что возможность предоставить "консольную" реализацию powershell (через PSHostRawUserInterface). Это работает лучше, но вы все равно можете ссылаться команд (в основном, реальных консольных приложений), таких как "... больше", которые ожидают чтобы иметь возможность использовать консоль api, а затем попытаться прочитать из консоль процесса обертки.
Так что я хотел бы сделать, это набор функций, которые заменяют обычные функции ввода/вывода консоли, которые используют консольные приложения, поэтому я могу их обработать. Но это кажется довольно резким, поскольку это плохая идея дизайна (imo).
Сейчас я собираюсь манипулировать консолью, отправив соответствующие ключи с помощью функций native/Pinvoke, таких как WriteConsoleInput. Я понимаю, что можно было бы подделать консоль именно так. Но я не вижу, как бы тогда "читать", что происходит на консоли.
Также имейте в виду, что это услуга, поэтому желательно, чтобы она не создавала фактическое окно консоли, хотя, возможно, в сеансе Windows 0, который не отображался и не имел значения.