从Cygwin运行脚本时,Powershell的Read-Host cmdlet会导致挂起

时间:2015-07-03 19:56:46

标签: powershell cygwin

我正在尝试从Cygwin中运行一个powershell脚本(最终将通过Cygwin SSH运行),并且发现用户输入似乎被忽略了。该脚本显示一个菜单,然后使用Read-Host "Your selection:"接收输入。

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

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

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

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