Командлет Powershell Read-Host вызывает зависание при запуске скрипта из Cygwin

Я пытаюсь запустить сценарий powershell из Cygwin (в конечном итоге он будет работать через Cygwin SSH), и я обнаружил, что пользовательский ввод, похоже, игнорируется. Сценарий отображает меню, а затем использует Read-Host "Your selection:" для получения ввода.

Курсор мигает, но текст «Ваш выбор» не появляется, и все, что я ввожу, кажется, просто пишет в саму консоль и игнорируется сценарием.

Кто-нибудь знает, что может быть не так?

Большое спасибо.


person iank    schedule 03.07.2015    source источник


Ответы (1)


Я предполагаю, что консоль Cygwin не реализует API-интерфейсы, от которых зависит хост консоли Powershell (System.Management.Automation.Internal.Host.InternalHostUserInterface). Или не реализует их, как ожидалось. Это обязательно произойдет, если вы попытаетесь запустить SSH. У MS есть документация о том, как написать собственный интерфейс хоста. Итак, если вы хотите запустить PS через SSH, похоже, есть 4 возможности:

  1. Напишите свою собственную реализацию PSHost
  2. Найдите чужую реализацию PSHost
  3. Используйте клиенты SSH stdin и stdout как двусторонний канал и напишите REPL, который принимает входные данные из канала (SSH stdin) и отправляет выходные данные в канал (SSH stdout). Если вы не реализуете это самостоятельно, эта опция означает, что вы потеряете редактирование строк, историю, завершение табуляции и т. д.
  4. Не уверен, что это будет работать, но это может быть наименьший объем кода для реализации, если он сработает. Создайте дочерний процесс PS. Перенаправить дочерний stdout, stdin родительскому процессу PS. Все входные данные, которые вы получаете из стандартного ввода SSH, вы записываете в стандартный ввод дочерней PS, а все выходные данные, которые вы читаете из стандартного вывода дочернего объекта, вы записываете в стандартный вывод SSH. Вы, вероятно, захотите использовать асинхронный ввод-вывод для чтения из SSH stdin и дочернего stdout, чтобы предотвратить зависание (если скрипт ожидает чтения из дочернего stdout, но дочерний PS больше не имеет вывода, то скрипт зависает ). По сути, пользователь SSH управляет дочерним процессом PS, а родительский процесс PS является всего лишь связующим звеном между ними.
person Χpẘ    schedule 17.11.2015