2016-11-08 1 views
1

У меня есть функция, где я вызываю приложение с оператором &. Приложение производит несколько выходных данные команды линии строки, загружает некоторые файлы, и возвращает строку:Буферизация Out-Host?

& "app.exe" | Out-Host 
$var = ... 
return $var 

Кажется, что на консоли появится выход произведенного app.exe только после того, как app.exe завершается. У пользователя нет информации в реальном времени, которую загружает файл. Есть ли способ постоянно обновлять консоль при запуске app.exe?

+0

Что делать, если вы запускаете '" app.exe "| more' в CMD, он показывает результаты сразу же? – PetSerAl

+0

Будет ли «больше» отправлять выходные данные на стандартный вывод? Я использую 'Write-Host', чтобы исключить выходные данные в возвращаемой переменной. – robert

+0

Конвейер PowerShell не работает как cmd для внешних утилит. Он действительно ждет завершения команды. Просто вызовите 'app.exe' без' & 'и' out-host'. – wOxxOm

ответ

2

Многие консольные приложения буферизуют свой выходной поток, если он известен как перенаправленный. На самом деле, it is standard behavior of C library. Итак, буферизация сделана app.exe, из-за перенаправления, но не на Out-Host.

Решение было бы не перенаправлять вывод app.exe, даже если внешняя команда перенаправлена. За исключением того, что вы должны знать условие exact, когда PowerShell не перенаправляет выходной поток консольного приложения и связывает его напрямую с собственным потоком вывода, который будет консольным для интерактивного сеанса PowerShell.exe. Условия:

  1. Команда - последний пункт в конвейере.
  2. Команда передается по трубопроводу до Out-Default.

Решение будет команда обертка в блок сценария, и труба, что блок сценария к Out-Default:

& { & "app.exe" } | Out-Default 

Другим решением было бы использовать Start-Process командлет с -NoNewWindow и -Wait параметрами:

Start-Process "app.exe" -NoNewWindow -Wait 
Смежные вопросы