IMPORTANTE:
Hemos estado utilizando la función proporcionada anteriormente por LPG .
Sin embargo, esto contiene un error que puede encontrar cuando inicia un proceso que genera una gran cantidad de resultados. Debido a esto, puede terminar con un punto muerto al usar esta función. En su lugar, utilice la versión adaptada a continuación:
Function Execute-Command ($commandTitle, $commandPath, $commandArguments)
{
Try {
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $commandPath
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = $commandArguments
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
[pscustomobject]@{
commandTitle = $commandTitle
stdout = $p.StandardOutput.ReadToEnd()
stderr = $p.StandardError.ReadToEnd()
ExitCode = $p.ExitCode
}
$p.WaitForExit()
}
Catch {
exit
}
}
Puede encontrar más información sobre este problema en MSDN :
Puede producirse una condición de interbloqueo si el proceso padre llama a p.WaitForSalir antes de p.StandardError.ReadToEnd y el proceso hijo escribe suficiente texto para completar la secuencia redirigida. El proceso padre esperaría indefinidamente a que salga el proceso hijo. El proceso hijo esperaría indefinidamente a que el padre leyera el flujo de StandardError completo.
$process= ping localhost
# guardaría la salida en la variable de proceso.