Я решал подобную проблему несколько недель назад.Если вы не хотите использовать & (& '.\program.exe'
), вы можете использовать запуск процесса и читать вывод при запуске процесса (где вы читаете вывод явно).
Просто поместите это как отдельный файл PS1 -например (или в макрос):
param (
$name,
$params
)
$process = New-Object System.Diagnostics.Process
$proInfo = New-Object System.Diagnostics.ProcessStartInfo
$proInfo.CreateNoWindow = $true
$proInfo.RedirectStandardOutput = $true
$proInfo.RedirectStandardError = $true
$proInfo.UseShellExecute = $false
$proInfo.FileName = $name
$proInfo.Arguments = $params
$process.StartInfo = $proInfo
#Register an Action for Error Output Data Received Event
Register-ObjectEvent -InputObject $process -EventName ErrorDataReceived -action {
foreach ($s in $EventArgs.data) { Write-Host $s -ForegroundColor Red }
} | Out-Null
#Register an Action for Standard Output Data Received Event
Register-ObjectEvent -InputObject $process -EventName OutputDataReceived -action {
foreach ($s in $EventArgs.data) { Write-Host $s -ForegroundColor Blue }
} | Out-Null
$process.Start() | Out-Null
$process.BeginOutputReadLine()
$process.BeginErrorReadLine()
$process.WaitForExit()
И затем назвать его следующим образом:
.\startprocess.ps1 "c:\program.exe" "params"
Вы также можете легко перенаправить вывод или реализовать какое-то время ожидания в случае, если ваше приложение может зависнуть...