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

Powershell';从Cygwin运行脚本时,s Read-Host cmdlet会导致挂起,powershell,cygwin,Powershell,Cygwin,我试图在Cygwin中运行powershell脚本(最终将在Cygwin SSH上运行),发现用户输入似乎被忽略了。脚本显示一个菜单,然后使用读取主机“您的选择:接收输入 有一个闪烁的光标,但“您的选择”文本没有出现,我输入的任何内容似乎只是写入控制台本身,脚本会忽略它 有人知道会出什么问题吗 非常感谢。我猜Cygwin控制台没有实现Powershell控制台主机(System.Management.Automation.Internal.host.InternalHostUserInterfa

我试图在Cygwin中运行powershell脚本(最终将在Cygwin SSH上运行),发现用户输入似乎被忽略了。脚本显示一个菜单,然后使用
读取主机“您的选择:
接收输入

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

有人知道会出什么问题吗


非常感谢。

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

  • 编写自己的PSHost实现
  • 查找其他人的PSHost实现
  • 将SSH的客户端stdin和stdout用作双向管道,并编写一个从管道中获取输入(SSH stdin)并将输出发送到管道(SSH stdout)的命令。除非您自己实现,否则此选项意味着您将失去行编辑、历史记录、制表符完成等功能
  • 不确定这一步是否可行,但如果可行的话,它可能是实现代码量最少的一步。创建一个子进程。将子进程的stdout、stdin重定向到父进程。从SSH-stdin获得的所有输入都写入child-PS的stdin,从child的stdout读取的所有输出都写入SSH-stdout。您可能希望对SSH stdin和child的stdout上的读取使用异步I/O,以防止挂起(如果脚本正在等待从child的stdout读取,但child PS没有更多输出,那么脚本将挂起)。实际上,SSH用户正在控制子PS进程,而父PS进程只是将两者连接在一起的粘合剂