2015-07-03 49 views
2

我试图从Cygwin中运行powershell脚本(最终将通过Cygwin SSH运行),并且发现用户输入似乎被忽略。脚本显示一个菜单,然后使用Read-Host "Your selection:"接收输入。当从Cygwin运行脚本时,Powershell的Read-Host cmdlet会导致挂起问题

有一个闪烁的光标,但“您的选择”文本没有出现,我输入的任何东西似乎只是写入控制台本身,并被脚本忽略。

有谁知道什么可能是错的?

非常感谢。

回答

1

我猜Cygwin控制台没有实现Powershell控制台的主机(System.Management.Automation.Internal.Host.InternalHostUserInterface)所依赖的API。或者不按预期实施它们。如果您尝试通过SSH运行,则肯定会出现这种情况。 MS有关于如何编写自定义主机UI的文档。所以,如果你想通过SSH运行PS好像有4种可能性:

  1. 写自己的PSHost实现
  2. 找别人的PSHost实施
  3. 标准输入使用你的SSH的客户和stdout为双向管并编写一个REPL,它从管道(SSH标准输入)获取输入并将输出发送到管道(SSH标准输出)。除非你自己实现它,否则这个选项意味着你失去了行编辑,历史记录,制表符完成等。
  4. 不确定这个函数是否可以工作,但是如果它实现的话可能是最少的代码实现。创建一个儿童PS过程。将孩子的stdout stdin重定向到父PS进程。您从SSH stdin获得的所有输入都写入到子PS的标准输入中,以及您从您写入SSH标准输出的子标准输出中读取的所有输出。您可能想要使用异步I/O来读取SSH标准输入和子标准输出,以防止挂起(如果脚本正在等待从孩子的标准输出读取,但孩子PS没有更多输出,则脚本被挂起)。实际上,SSH用户正在控制子PS过程,父PS过程就是将两者连接在一起的粘合剂。