2013-04-19 13 views
5

Jeśli skompiluję ten kod C# do pliku EXE i uruchomię go w powłoce poleceń systemu Windows, działa on poprawnie: wyprowadza monity, czeka w tym samym wierszu dla niektórych danych wprowadzonych przez użytkownika, a następnie wpisuje, echo tego wejścia. Działa w powłoce PowerShell v3 również działa dobrze. Jeśli jednak uruchomię ten sam plik EXE w programie PowerShell ISE V3, to nigdy nie będzie on emitował danych wyjściowych z Write i wisi na urządzeniu ReadLine. (Tak na marginesie, to będzie emitować sygnał wyjściowy z Write jeśli jest później następuje WriteLine.)Dlaczego PowerShell ISE jest zawieszony w tym programie C#?

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

Czy to jest bug ISE czy jest jakiś majątek, aby dostosować, aby to działało ...?

+0

Nie jestem pewien, czy jest to istotne, ale w Powershell czasem nazywa się * Pobieranie z klawiatury *, które może zaimplementować pewne problemy. Więc być może, gdy 'Console.ReadLine()' zostanie wywołana z powodu Powershell, używając tego pollingu może być przyczyną konfliktu. – Greg

Odpowiedz

4

ISE nie obsługuje klasy console.

  • Brak wsparcia dla [Console] Klasa, spróbuj [konsola] :: BackgroundColor = 'white' .
    • W ogóle, skrypty powinny używać (write-host przyjmującego API, zamiast [Console] Klasa, tak że pracują zarówno w konsoli, ISE, remoting i inne pociski.

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

+0

Andy: Uświadomiłeś mi, że pytanie, które powinienem zadać, zależy od odpowiedzi: jeśli istnieje obejście/ustawienie/etc. to pytanie byłoby dobrze, jak jest, ale ponieważ wskazuje się, że jest _nie_, to lepszym pytaniem powinno być coś takiego: czy jest jakiś sposób na odczytanie danych wejściowych w języku C# z ISE bez użycia konsoli? _ Ale nie wiedziałem, że apriorycznie. W każdym razie, odpowiedziałeś na pytanie, więc dostałeś znacznik wyboru - dziękuję! –

+0

To byłoby dobre pytanie @msorens, powinieneś go zapytać. –

0

PowerShell odczytu gospodarz będzie czytać z konsoli można wykonać odczyt hosta z poziomu C# wykonywania poleceń PS z C# jest udokumentowana w witrynie MSDN w sekcjach o pow.. ershell hosting. Poniżej przedstawiono wywołania metod za pomocą skryptu Powershell - powinno być łatwo przekonwertować na język C#. Zwróć uwagę, że $ host musi zostać przekazany do programu C#. Dlatego trzeba by załadować program C# jako zespół w ISE i powołać main() takich jak: [myclass] :: Main ($ host) (w porównaniu do wywoływania EXE jako samodzielny program)

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

As obejście, w trybie powershell, zamiast wywoływać .\ConsoleApplication1.exe zadzwonić pod numer start .\ConsoleApplication1.exe Spowoduje to uruchomienie aplikacji w nowym wierszu polecenia, który będzie akceptował dane wejściowe ze standardowego wejścia.

+0

+1 To poręczne obejście - dzięki za sugestię! –

Powiązane problemy