Почему эта команда powershell не производит вывод? - PullRequest
1 голос
/ 07 мая 2019

Давайте рассмотрим a.ps1:

[pscustomobject]@{date=(Get-Date);id="test"}
exit 0

и следующие две команды, которые его выполняют:

Команда 1: powershell -noprofile -ex unrestricted "& './a.ps1'; exit $lastexitcode" - без вывода.

Команда2: powershell -noprofile -ex unrestricted "& './a.ps1'; $lastexitcode", вывод:

date               id
----               --
07-May-19 11:04:54 test
0

Можете ли вы объяснить, почему первая команда не производит вывод?Я ожидаю, что он напечатает тот же объект с date и id, который печатает вторая команда (но, очевидно, не код выхода).

Примечание: я проверял это с powershell 5 и powershell6 как из cmd.exe, так и из консоли powershell.Во всех случаях результаты были одинаковыми.

1 Ответ

2 голосов
/ 07 мая 2019

Скорее всего, это связано с внутренней задержкой обработки вывода, которую обеспечивает PS.

Весь вывод задерживается примерно на 300 мс, чтобы правильно определить ширину столбцов для элементов переменной ширины при форматировании отображения при рендеринге вывода. Например, при выводе Get-ChildItem необходимо, чтобы вы могли получить хорошее полезное табличное форматирование без появления заголовков в каждой строке

Если вы вызовете exit слишком рано после вывода, вывод не будет отображаться, потому что конвейер вывода, через который должны пройти результаты, будет деконструирован до того, как данные попадут туда. Чтобы обойти это, передайте результаты по номеру Out-String | Write-Host или просто Out-Host перед вызовом exit, чтобы заставить результаты достичь хоста до фактического завершения подпроцесса.

Ссылки, иллюстрирующие / объясняющие части этого:

Я думал, что для этого есть встроенная справочная тема, но я не увидел ее из беглого взгляда на about_* тем ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...