IMPORTANTE:
Temos usado a função fornecida acima pelo LPG .
No entanto, isso contém um bug que você pode encontrar ao iniciar um processo que gera muita saída. Devido a isso, você pode acabar com um deadlock ao usar esta função. Em vez disso, use a versão adaptada abaixo:
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
}
}
Mais informações sobre esse problema podem ser encontradas no MSDN :
Uma condição de deadlock pode ocorrer se o processo pai chamar p.WaitForExit antes de p.StandardError.ReadToEnd e o processo filho gravar texto suficiente para preencher o fluxo redirecionado. O processo pai esperaria indefinidamente pela saída do processo filho. O processo filho esperaria indefinidamente pelo pai ler o fluxo StandardError completo.
$process= ping localhost
# salvaria a saída na variável de processo.