2012-03-01 19 views
1

私はVBからpowershellスクリプトを実行しようとしています。コンソールアプリケーション内で実行されているので、スクリプトの出力を見たいと思っています。私のスクリプト(以下に示す)を使ってpowershellから実行すると、 "Command Sleep Starting"が表示され、5秒間待ってから他のテキストを表示します。PowerShellスクリプトを実行してリアルタイム出力を表示する方法は?

しかし、VB.NETプログラムから実行すると、実行は5秒間待機し、すべてのテキスト出力を一度にダンプします。最初のWrite-Outputコマンドは実行されず、待機してから出力する必要があります。

Write-Output "Command Sleeping Starting" 
Start-Sleep -Seconds 5 
Write-Output "Command ran successfully" 

VB .Netプログラムからスクリプトを実行すると、リアルタイム実行出力を表示する方法はありますか?

私が使用したコードは次のとおりです。

  Dim start As New ProcessStartInfo 
      Dim ScriptsFolder As String = GetKeyValue("ScriptsFolder") 
      Console.WriteLine(ScriptsFolder.ToString()) 
      start.FileName = "powershell.exe" 
      start.Arguments = ScriptsFolder + "\" + ScriptFile 
      start.UseShellExecute = False 
      start.RedirectStandardOutput = True 
      start.RedirectStandardError = True 

      Dim myproc As New Process 
      myproc.StartInfo = start 
      myproc.Start() 
      Dim so As System.IO.StreamReader 
      Dim se As System.IO.StreamReader 
      se = myproc.StandardError 
      so = myproc.StandardOutput 
      myproc.WaitForExit() 
      Console.WriteLine(so.ReadToEnd) 
      Console.WriteLine(se.ReadToEnd) 
+0

[誰か](http://stackoverflow.com/questions/8740118/interact-with-powershell-process-called- VB.NETで実行空間をスピンアップするための簡単なスニペットですfrom-java-application/8740564#8740564)はJavaでこれをしようとしていました。プロセスが終了するまでstdoutを読むことができないのですか。 –

答えて

4

あなたはSystem.Windows.Automation名前空間を使用してではなく、プロセスを開始するプログラムでPowerShellの実行空間を実行すると考えたことがありますか?次に、ロガーオブジェクトをパイプラインに渡してログに記録し、メッセージをリアルタイムで表示することができます。ここで

' create Powershell runspace 
    Dim MyRunSpace As Runspace = RunspaceFactory.CreateRunspace() 

    ' open it 
    MyRunSpace.Open() 

    ' create a pipeline and feed it the script text 
    Dim MyPipeline As Pipeline = MyRunSpace.CreatePipeline() 

    MyPipeline.Commands.AddScript(scriptText) 

    ' pass in a logger object you can use instead of Write-Output 
    MyPipeline.Runspace.SessionStateProxy.SetVariable("logger", SomeLoggerObject) 

    ' execute the script 
    Dim results As Collection(Of PSObject) = MyPipeline.Invoke() 

    ' close the runspace 
    MyRunSpace.Close() 
+0

これに同意します。 PowerShell.exeを呼び出すのではなく、単にAPIを使用してください:-) –

+0

私は上記の方法がpowershellコマンドを実行する方法であることに同意しますが、私の質問はそれではなかったことは残念です。スクリプトが実行されている間に増分出力を表示できるかどうかを知りたかったのです。このアプローチは段階的な出力を示すでしょうか? – Mitul

+0

ロガーオブジェクトをスクリプトに渡した後、書き込み出力呼び出しをロガーへの呼び出しで置き換えると、ロガーからのリアルタイムデータを表示する機能は実装によって異なります。例はTraceListenerモデルで、必要なリスナーを登録し、必要に応じてロギング出力を視覚化することができます。 –

関連する問題