2012-12-10 3 views
0

PowerShell으로 작동하도록 설계된 일부 개체를 쓰고 있습니다. PowerShell 콘솔에 비동기 적으로 직접 쓸 수있는 기능을 원합니다. 지금까지 , 나는 다음과 같은 한 :PowerShell 호스트에 비동기 쓰기

  • 을 만들어를 WriteLine과 같은 몇 가지 방법을 노출하는 IUtilityHost 인터페이스 나는 PSUtilityHost의 인터페이스를 구현
  • : IUtilityHost 클래스
  • 이 구현 된 PSHost 객체를 WriteLine 메서드를 래핑 PSHost.UI 개체에서 WriteLine 메서드를 호출하여 구현됩니다.

문제는 수동 입력이 필요할 때 실행을 차단하기 위해 가끔씩 필요한 메시지 인 Read-Host을 섞어서 출력한다는 것입니다.

비동기 적으로 powershell 호스트에 메시지를 보내는 더 좋은 방법이 있는지 알고 싶습니다. C 번호에서 호스트 개체를 잡아이 예를 수행하기 위해 쓰기 * 방법을 사용하는

감사

+0

PowerShell 호스트를 직접 만들고 있습니까? 그렇다면 호스트 UI 구현을 완벽하게 제어 할 수 있습니다. 그렇지 않은 경우 코드를 호스트에 쓰고 항상 cmdlet의 실행 컨텍스트로 실행해야합니까? 또는 사용자가 스크립트에서 개체를 호출 할 수 있으며 결과적으로 개체가 호스트에 기록 (cmdlet 호출 컨텍스트 외부) 할 수 있습니까? –

+0

첫 번째 인스턴스에서는 PowerShell 콘솔의 기본 PSHost를 사용하고 싶지만 나중에 다른 사용자 지정 호스트와도 다시 사용하고 싶습니다. 그래서 표준 방법과 패턴을 사용하는 것을 선호합니다. 개체는 스크립트에 있지만 본질적으로 양방향 WCF 서비스를 호스팅하며 일부 특정 메서드를 사용하여 클라이언트에 "응답"할 수 있도록 PowerShell 콘솔에 요청 로그를 작성하려고합니다. 따라서 개체는 cmdlet 호출 컨텍스트 외부에 있습니다. – fra

답변

0

시도 :

public class Poco 
{ 
    private PSHostUserInterface _ui; 

    public Poco() 
    { 
     var runspace = Runspace.DefaultRunspace; 
     Pipeline pipeline = runspace.CreateNestedPipeline("Get-Variable host -ValueOnly", false); 
     Collection<PSObject> results = pipeline.Invoke(); 
     if (results.Count > 0) 
     { 
      var host = results[0].BaseObject as PSHost; 
      if (host != null) 
      { 
       _ui = host.UI; 
      } 
     }    
    } 

    public void WriteLine(string msg) 
    { 
     _ui.WriteLine(msg); 
    } 
} 

참고 : 그냥이 작업을 수행하기 위해 Console.WriteLine을 사용할 수있는 동안 PowerShell 프롬프트는 콘솔 응용 프로그램이 아닌 ISE와 같은 다른 PowerShell 호스트에는 도움이되지 않습니다.

+0

이것은 다소 (내 생성자에서 호스트를 전달하는) 내 솔루션입니다. 어쨌든 중첩 파이프 라인을 만드는 것은 나를 위해 예외를 던졌습니다 (나는 클리너 Write-Host를 시도했습니다). 더 좋아, 나는 더 나은 출력을 원한다. Read-Host 메시지와 혼합되어 있기 때문이다. Write-Progress와 비슷한 동작을 생각하고 있었지만 UI에 "오버레이/메시지"를 표시 할 수있는 미리 정의 된 방법이 있는지 여부는 알 수 없습니다. – fra

+0

추가 세부 사항 : 내 솔루션의 경우'Read-Host'로 입력 대기중인 스크립트를 차단하면 콘솔에서 수신 메시지를 볼 수 있습니다. 일반 콘솔을 사용하는 경우 입력 할 때만 모든 메시지가 플러시됩니다 (PSHost.UI.WriteXXX 메소드를 사용 중입니다). – fra

+0

@fr PowerShell에서 파이프 라인 내에서 호출했기 때문에 CreateNestedPipeline을 ctor에 붙여야했습니다. 또 다른 옵션은 UI.RawUI로 드롭 다운하고 디스플레이의 개별 셀을 조작하는 것입니다. –

관련 문제