首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Start-Process捕获标准输出和错误

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

Stack Overflow用户
提问于 2012-01-07 01:29:04
回答 8查看 216.5K关注 0票数 135

在访问StandardErrorStandardOutput属性时,PowerShell的Start-Process命令中是否存在错误?

如果我运行以下命令,则不会得到任何输出:

代码语言:javascript
复制
$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait
$process.StandardOutput
$process.StandardError

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

代码语言:javascript
复制
$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait -RedirectStandardOutput stdout.txt -RedirectStandardError stderr.txt
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-01-07 01:43:24

出于某些原因,Start-Process就是这样设计的。这里有一个不用发送到文件就能得到它的方法:

代码语言:javascript
复制
$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
票数 154
EN

Stack Overflow用户

发布于 2014-12-11 18:19:52

在问题中给出的代码中,我认为读取initiation变量的ExitCode属性应该是可行的。

代码语言:javascript
复制
$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait
$process.ExitCode

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

票数 26
EN

Stack Overflow用户

发布于 2015-11-11 22:32:10

我也遇到了这个问题,最后我使用Andy's code创建了一个函数,在需要运行多个命令时进行清理。

它将返回stderr、stdout和退出代码作为对象。需要注意的一件事是:该函数不接受路径中的.\;必须使用完整路径。

代码语言:javascript
复制
Function Execute-Command ($commandTitle, $commandPath, $commandArguments)
{
    $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
    $p.WaitForExit()
    [pscustomobject]@{
        commandTitle = $commandTitle
        stdout = $p.StandardOutput.ReadToEnd()
        stderr = $p.StandardError.ReadToEnd()
        ExitCode = $p.ExitCode
    }
}

下面是它的使用方法:

代码语言:javascript
复制
$DisableACMonitorTimeOut = Execute-Command -commandTitle "Disable Monitor Timeout" -commandPath "C:\Windows\System32\powercfg.exe" -commandArguments " -x monitor-timeout-ac 0"
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8761888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档