使用Start-Process捕获标准输出和错误

17 浏览
0 Comments

使用Start-Process捕获标准输出和错误

在访问StandardErrorStandardOutput属性时,PowerShell的Start-Process命令存在bug吗?

如果我运行以下命令,将不会有输出:

$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait
$process.StandardOutput
$process.StandardError

但如果我将输出重定向到文件中,我会得到预期的结果:

$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait -RedirectStandardOutput stdout.txt -RedirectStandardError stderr.txt

admin 更改状态以发布 2023年5月21日
0
0 Comments

在问题中给出的代码中,我认为读取创建变量的ExitCode属性应该可以工作。\n

$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait
$process.ExitCode

\n请注意(与您的示例一样),您需要添加-PassThru和-Wait参数(这让我困扰了一段时间)。

0
0 Comments

看起来是因为这个原因 Start-Process 被设计出来了。以下是不使用发送到文件的方法:

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "ping.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "localhost"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
Write-Host "stdout: $stdout"
Write-Host "stderr: $stderr"
Write-Host "exit code: " + $p.ExitCode

0