2013-04-19 25 views
5

Nếu tôi biên dịch mã C# này thành tệp EXE và chạy trong vỏ lệnh Windows, nó chạy tốt: xuất dấu nhắc, đợi trên cùng dòng cho một số người dùng nhập, sau đó nhập, lặp lại đầu vào đó. Chạy trong một vỏ PowerShell v3 nó cũng chạy tốt. Tuy nhiên, nếu tôi chạy cùng một tệp EXE này trong PowerShell ISE V3, nó sẽ không bao giờ phát ra đầu ra từ Write và nó bị treo trên ReadLine. (Là một sang một bên, nó sẽ phát ra đầu ra từ Write nếu nó sau này được theo sau bởi một WriteLine.)Tại sao PowerShell ISE lại sử dụng chương trình C# này?

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      System.Console.Write("invisible prompt: "); 
      var s = System.Console.ReadLine(); 
      System.Console.WriteLine("echo " + s); 
     } 
    } 
} 

Đây có phải là một lỗi ISE hoặc là có một số tài sản để điều chỉnh để làm cho nó làm việc ...?

+0

Không chắc chắn nếu nó có liên quan nhưng trong Powershell nó đôi khi được gọi là * Bàn phím Polling * mà có thể thực hiện một số vấn đề. Vì vậy, có thể khi 'Console.ReadLine()' được gọi là do Powershell sử dụng việc bỏ phiếu đó có thể gây ra xung đột. – Greg

Trả lời

4

ISE không hỗ trợ cho lớp học console.

  • Không hỗ trợ các [điều khiển] lớp, hãy thử [console] :: BackgroundColor = 'trắng'.
    • Nói chung, kịch bản nên sử dụng các API máy chủ của (write-host, thay vì [điều khiển] lớp, do đó họ làm việc trong cả hai giao diện điều khiển, ISE, Remoting và tiện ích khác.

tham khảo: http://blogs.msdn.com/b/powershell/archive/2009/04/17/differences-between-the-ise-and-powershell-console.aspx

+0

Andy: Bạn đã làm cho tôi nhận ra rằng câu hỏi mà tôi nên hỏi phụ thuộc vào câu trả lời: nếu có một giải pháp/thiết lập/etc. thì câu hỏi này sẽ tốt như vậy, nhưng kể từ khi bạn chỉ ra có _not_ thì câu hỏi tốt hơn nên có một cái gì đó như: _ có cách nào để đọc đầu vào trong C# từ ISE mà không cần sử dụng giao diện điều khiển? _ Nhưng tôi không biết rằng một ưu tiên. Dù sao, bạn trả lời nó như được hỏi để bạn có được dấu kiểm - cảm ơn! –

+0

Đó sẽ là một câu hỏi hay @msorens, bạn nên hỏi nó. –

0

Powershell đọc-host sẽ đọc từ bàn điều khiển Bạn có thể thực hiện đọc chủ từ bên trong C# thực hiện lệnh PS từ C# là tài liệu trên MSDN trong các phần về Pow.. lưu trữ ershell. Phần sau đây trình bày các phương thức gọi bằng kịch bản lệnh Powershell - nên dễ chuyển đổi sang C#. Lưu ý rằng $ host phải được chuyển vào chương trình C#. Vì vậy, bạn sẽ phải tải các chương trình C# như một lắp ráp trong ISE và gọi Main() như sau: [myclass] :: Main ($ host) (so với cách gọi các EXE như một chương trình độc lập)

[powershell]::create().AddScript('param($ho) $ho.ui.readline()').AddArgument($host).Invoke() 
4

Như một cách giải quyết khác, thay vì gọi số .\ConsoleApplication1.exe, hãy gọi start .\ConsoleApplication1.exe Điều này sẽ khởi động ứng dụng trong dấu nhắc lệnh mới, sẽ chấp nhận đầu vào từ stdin.

+0

+1 Đó là giải pháp hữu ích - cảm ơn bạn đã đề xuất! –