Josh
Josh

Reputation: 744

Powershell continuously grab output from cmdlet

I'm new to Powershell. I need to capture the output from a command-line call in Powershell continuously and preferably send it to another function. My code currently waits until the external program is completely finished. Here's what I've got:

$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = "DataSet.exe"
$startInfo.CreateNoWindow = $true
$startInfo.UseShellExecute = $false
$startInfo.RedirectStandardError = $true
$startInfo.RedirectStandartOutput = $true
$startInfo.Arguments = "1 off"

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $startInfo
$process.Start() | Out-Null
$stdOut = $process.StandardOutput.ReadToEnd()
$stdErr = $process.StandardError.ReadToEnd()
$process.WaitForExit()

process($stdOut)
process($stdErr)

# Do stuff with $process.ExitCode

Here's what I need

...

while (readOutput)
{
  process($stdOut)
  process($stdErr)
}

...

Upvotes: 1

Views: 521

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200293

I would recommend using a background job for this kind of thing, e.g. like this:

$job = Start-Job -ScriptBlock { & "some.exe" }

while ($job.State -eq 'Running') {
    Receive-Job $job -OutVariable $outValue -ErrorVariable $errValue

    if ($outValue) { Do-SomethingWith $outValue }
    ir ($errValue) { Do-OtherWith $errValue }

    Start-Sleep -Milliseconds 200
}

Upvotes: 1

Related Questions