2013-05-02 6 views
9

응용 프로그램에 상당히 제한된 PowerShell 지원을 추가하려고합니다. 사용자 정의 PowerShell 스크립트를 주기적으로 실행하고 결과 및 (결국) 진행 통지 및 사용자 프롬프트 요청을 처리 할 수 ​​있어야합니다. I 은 명령 줄 스타일의 대화식 지원이 필요하거나 원격 스크립트 나 여러 개의 동시 스크립트를 실행할 수있는 기능이 필요하지 않습니다. 사용자 스크립트가 자체 호스트 I에서 자체 스크립트를 수행하지 않는 한. 궁극적으로 비동기 적으로 또는 백그라운드 스레드에서 스크립트를 실행하고 일부 초기 변수와 함께 쉘을 시드하려는 경우 어쩌면 cmdlet하지만이 기능은 "좋아"할 것 같습니다.Hosting PowerShell : PowerShell vs. Runspace vs. RunspacePool vs. 파이프 라인

나는 MSDN documentation about writing host application code를 읽고,하지만 행복하게는 Runspace, 또는 RunspacePool, 또는 PipelinePowerShell 객체를 만들거나하는 방법을 을 설명하면서, 약 하나 이상의 이러한 방법 중 하나를 선택하는 이유 징후가 없다 봤는데 다른.

나는 나는이 두 가지 중 하나를 아래라고 생각 ,하지만 난 방법은 더 나은 사람이 걸릴 인에 대한 몇 가지 의견을 같이했습니다 :

PowerShell shell = PowerShell.Create(); 
shell.AddCommand(/* set initial state here? */); 
shell.AddStatement(); 
shell.AddScript(myScript); 
shell.Invoke(/* can set host! */); 

나 :

Runspace runspace = RunspaceFactory.CreateRunspace(/* can set host and initial state! */); 
PowerShell shell = PowerShell.Create(); 
shell.Runspace = runspace; 
shell.AddScript(myScript); 
shell.Invoke(/* can set host here, too! */); 

(필요한 - 유도 된 클래스 메서드 중 하나는 EnterNestedPrompt()이고 사용자가 실행 한 스크립트로 호출 할 수 있는지 여부를 알 수 없습니다. 가능하면 "시작 새로운 중첩 된 입력 loo p "(as per here) ... 위의 경로에 영향을 주면 잘 알 수 있습니다.

고마워요!

+2

실제로 호스트가 필요하지 않습니다. Write-Host, Read-Host 등의 호출을 피하십시오. PS에 호스트가 연결되어 있는지 확인하는 방법이 있지만 그 순간은 기억하지 못합니다. –

+0

필자는 PSHost를 _need_하지 않을 수도 있지만, 필자의 경우에는 필자가 원한다면 ... 사용자 정의 스크립트가 때때로 보여줄 수 있기를 원하는 가끔씩의 진단 메시지를 갖기를 기대하고있다. (원래 게시물을 편집하여 더 명확하게 만듭니다.) – JaredReisinger

답변

1

너는 그것을 생각해 본다. 샘플에 표시하는 코드는 좋은 시작입니다. 이제 Invoke()의 결과를 읽고 오류 및 경고 스트림을 확인해야합니다.

PowerShell 호스트는 스트림 및 형식 출력, 진행 상황 표시, 오류보고 등과 같이 RunSpace가 사용자와 통신하는 데 사용할 수있는 몇 가지 훅을 제공합니다. PowerShell 호스트는 PowerShell 호스트를 필요로하지 않습니다. PowerShell 클래스를 사용하여 스크립트 실행 결과를 다시 읽고 오류, 경고를 확인하고 출력 스트림을 읽고 응용 프로그램의 기능을 사용하여 사용자에게 알림을 표시 할 수 있습니다. 오류가 발견 될 경우 전체 PowerShell 호스트를 작성하여 메시지 상자를 표시하는 것보다 훨씬 쉽고 효과적입니다.

또한 PowerShell 개체는 만들어 질 때 Runspace가 있으므로 하나도주지 않아도됩니다. 환경을 유지하기 위해 runspace를 유지해야하는 경우 Invoke를 호출 한 후 매번 PowerShell 객체 전체를 유지하고 명령과 모든 스트림을 지우십시오.

다음 질문은 PowerShell :: Invoke()의 결과를 처리하고 PowerShell :: Streams를 읽는 방법입니다.

+0

안녕하세요! PowerShell 개체 전체를 유지하고 Invoke 호출 후 매번 명령 및 모든 스트림을 지우는 방법을 확장 할 수 있습니까?나는 현재 runspaces를 사용하지 않고 있으며 이러한 이유로 구현하고자하지만 PowerShell 메서드를 사용하여이 작업을 수행 할 수 있습니까? 감사!! –

+0

질문하기 의견에 질문에 대답 할만한 포인트가 없습니다. ;) – Serjx86