在访问StandardError
和StandardOutput
属性时,PowerShell的Start-Process
命令中是否存在错误?
如果我运行以下命令,则不会得到任何输出:
$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
发布于 2012-01-07 01:43:24
出于某些原因,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
发布于 2014-12-11 18:19:52
在问题中给出的代码中,我认为读取initiation变量的ExitCode属性应该是可行的。
$process = Start-Process -FilePath ping -ArgumentList localhost -NoNewWindow -PassThru -Wait
$process.ExitCode
请注意(与您的示例中一样),您需要添加-PassThru
和-Wait
参数(这让我困惑了一段时间)。
发布于 2015-11-11 22:32:10
我也遇到了这个问题,最后我使用Andy's code创建了一个函数,在需要运行多个命令时进行清理。
它将返回stderr、stdout和退出代码作为对象。需要注意的一件事是:该函数不接受路径中的.\
;必须使用完整路径。
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
}
}
下面是它的使用方法:
$DisableACMonitorTimeOut = Execute-Command -commandTitle "Disable Monitor Timeout" -commandPath "C:\Windows\System32\powercfg.exe" -commandArguments " -x monitor-timeout-ac 0"
https://stackoverflow.com/questions/8761888
复制相似问题