Read-Host cmdlet ของ Powershell ทำให้เกิดการหยุดทำงานเมื่อเรียกใช้สคริปต์จาก 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 มีเอกสารเกี่ยวกับวิธีการเขียน Host UI แบบกำหนดเอง ดังนั้นหากคุณต้องการรัน PS บน SSH ดูเหมือนว่ามีความเป็นไปได้ 4 ประการ:

  1. เขียนการใช้งาน PSHost ของคุณเอง
  2. ค้นหาการใช้งาน PSHost ของบุคคลอื่น
  3. ใช้ไคลเอ็นต์ของ SSH stdin และ stdout เป็นไปป์แบบสองทางและเขียน REPL ที่รับอินพุตจากไปป์ (SSH stdin) และส่งเอาต์พุตไปยังไปป์ (SSH stdout) ตัวเลือกนี้หมายความว่าคุณจะสูญเสียการแก้ไขบรรทัด ประวัติ ความสมบูรณ์ของแท็บ ฯลฯ เว้นแต่ว่าคุณจะดำเนินการด้วยตนเอง
  4. ไม่แน่ใจว่าอันนี้จะใช้งานได้หรือเปล่า แต่อาจเป็นโค้ดจำนวนน้อยที่สุดที่จะนำไปใช้หากใช้งานได้ สร้างกระบวนการ PS ลูก เปลี่ยนเส้นทาง stdout ของเด็ก, stdin ไปยังกระบวนการ PS หลัก อินพุตทั้งหมดที่คุณได้รับจาก SSH stdin คุณเขียนไปยัง stdin ของ child PS และเอาต์พุตทั้งหมดที่คุณอ่านจาก stdout ของเด็กที่คุณเขียนไปยัง SSH stdout คุณอาจต้องการใช้ I/O แบบอะซิงโครนัสสำหรับการอ่านบน SSH stdin และ stdout ของเด็ก เพื่อป้องกันการแฮงค์ (หากสคริปต์กำลังรอการอ่านจาก stdout ของเด็ก แต่ PS ลูกไม่มีเอาต์พุตอีกต่อไป สคริปต์จะถูกหยุดทำงาน ). ผลที่ตามมาก็คือ ผู้ใช้ SSH กำลังควบคุมกระบวนการ PS ย่อย และกระบวนการ PS หลักเป็นเพียงกาวที่เชื่อมทั้งสองเข้าด้วยกัน
person Χpẘ    schedule 17.11.2015