Включение процесса PowerShell в лучшем случае шаткое, а ошибка - в случае необходимости что-то, что не спорадически виснет, как Start-Process, или захватывает вывод в конвейер, сохраняя при этом $ lastexitcode, большинство людей кажется для использования Process/ProcessStartInfo. Некоторые процессы много записывают на вывод или могут быть длинными, поэтому мы не хотим ждать, пока они не закончатся, чтобы увидеть выходной поток (не обязательно, чтобы хост ... мог быть файлом журнала). Так что я сделал эту функциюКомандная строка PowerShell Invoke
function Invoke-Cmd {
<#
.SYNOPSIS
Executes a command using cmd /c, throws on errors and captures all output. Writes error and info output to pipeline (so uses .NET process API).
#>
[CmdletBinding()]
param(
[Parameter(Position=0,Mandatory=1)][string]$Cmd,
[Parameter(Position=1,Mandatory=0)][ScriptBlock]$ErrorMessage = ({"Error executing command: $Cmd - Exit Code $($p.ExitCode)"}),
[Parameter()][int[]]$ValidExitCodes = @(0)
)
begin {
$p = New-Object System.Diagnostics.Process
$pi = New-Object System.Diagnostics.ProcessStartInfo
$pi.FileName = "cmd.exe"
$pi.Arguments = "/c $Cmd 2>&1"
$pi.RedirectStandardError = $true
$pi.RedirectStandardOutput = $true
$pi.UseShellExecute = $false
$pi.CreateNoWindow = $true
$p.StartInfo = $pi
$outputHandler = {
if ($EventArgs.Data -ne $null) { Write-Output $EventArgs.Data }
}
Write-Output "Executing..."
$stdOutEvent = Register-ObjectEvent -InputObject $p `
-Action $outputHandler -EventName 'OutputDataReceived'
$stdErrEvent = Register-ObjectEvent -InputObject $p `
-Action $outputHandler -EventName 'ErrorDataReceived'
}
process {
$p.Start() | Out-Null
$p.BeginOutputReadLine()
$p.BeginErrorReadLine()
$p.WaitForExit() | Out-Null
}
end {
Unregister-Event -SourceIdentifier $stdOutEvent.Name
Unregister-Event -SourceIdentifier $stdErrEvent.Name
if (!($ValidExitCodes -contains $p.ExitCode)) {
throw (& $ErrorMessage)
}
}
}
Проблема заключается в том, что Write-Output в моем обработчик событий не работает в том же контексте исполнения, как и сам Invoke-Cmd ... Как я могу получить свой обработчик событий к отложенной записи Вывод в выходной поток родительских функций?
Спасибо