Как показать вывод в реальном времени, запустив PowerShell Script? - PullRequest
1 голос
/ 01 марта 2012

Я пытаюсь запустить скрипт powershell из VB и хочу увидеть результат работы скрипта во время его запуска в консольном приложении.С моим сценарием (показанным ниже), когда я запускаюсь из powershell, он показывает «Запуск командного сна», затем ждет в течение 5 секунд, а затем отображает другой текст.выполнение ожидает в течение 5 секунд и сбрасывает весь вывод текста одновременно.Он не выполняет первую команду Write-Output, а затем ожидает и затем выводит, как следует.

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

Любая идея о том, как показать результаты выполнения в реальном времени, когда я запускаю скрипт из VB .Net Program?

Просто ниже приведен код, который я использовал.

            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)

1 Ответ

4 голосов
/ 02 марта 2012

Рассматривали ли вы выполнение пространства выполнения PowerShell программно с использованием пространств имен System.Windows.Automation вместо запуска процесса? Затем вы можете передать объект регистратора в конвейер и войти в него, отображая сообщения в реальном времени.

Вот простой фрагмент для раскрутки Runspace в VB.NET

    ' 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...