Что вы видите, это последствия новой функции PowerShell v5. Format-Table
теперь собирают ввод в течение 300 миллисекунд, чтобы найти лучшую ширину столбца. Он работает таким образом, даже если вы явно указываете -AutoSize:$false
.
Когда вы вводите команду в командной строке, эта команда неявно передается в один экземпляр команды Out-Default
. Затем команда Out-Default
решает, как форматировать объекты и печатать их на хосте (консоли) PowerShell. Таким образом, даже если вы не используете Format-Table
прямо в своем коде, это не значит, что у вас нет Format-Table
в вашем конвейере. Out-Default
может решить форматировать объекты как таблицу и использовать Format-Table
внутри.
Пользовательские объекты с четырьмя или менее свойствами и без специального форматирования, определенные для них в файлах формата, отформатированы как таблица. Используя Select-Object
с двумя свойствами, вы производите именно эти объекты.
Труба PowerShell однопоточная. Это означает, что Format-Table
не может просто выводить все собранные объекты по истечении интервала 300 миллисекунд. Format-Table
должны ждать, пока вы не нанесете на него следующий элемент (вызванный процесс) или конец отчета о конвейере (вызванный конечный блок).
PS> Get-NetAdapter | Select-Object Name,Status
>>> Pause
>>> [PSCustomObject]@{Name='Some long name';Status='Some long status'} #1
>>> Pause
>>> [PSCustomObject]@{Name='Even longer name';Status='Even longer status'}
>>> Pause
Press Enter to continue...:
Name Status
---- ------
Ethernet Up
Some long name Some long status
Press Enter to continue...:
Even longer... Even longer s...
Press Enter to continue...:
PS>
неявной Format-Table
не печатает ничего (строго говоря, распечатать пустую строку) перед первым Pause
, потому что он все еще ждет более входных объектов (300 миллисекунды еще не истек), чтобы принять решение о ширине столбца. Когда первый объект (# 1) приходит после интервала 300 миллисекунд (при условии, что вы не должны нажимать , введите), затем Format-Table
определите ширину столбца и распечатайте все собранные объекты. Любые другие объекты будут напечатаны без задержки, но они больше не могут влиять на ширину столбца. Если значение велико для столбца, оно будет усечено.
PS> Get-NetAdapter | Select-Object Name,Status | Format-Table
>>> Pause
Name Status
---- ------
Ethernet Up
Press Enter to continue...:
PS>
С помощью этого кода, конечный блок явного Format-Table
будет выполняться перед Pause
. В конце блока Format-Table
знают, что он уже получил все входные данные, поэтому он может выбирать ширину столбца и сразу выводить все собранные объекты. Неявные Out-Default
видят, что форматирование объектов с Format-Table
вывода и Out-Default
знают, что им не нужно форматировать добавление и печатать их на хосте (консоли) сразу же. Итак, вся таблица была напечатана до вызова Pause
.
Обратите внимание на разницу в размещении знака конца таблицы (две пустые строки). В первом примере он помещался после последнего Pause
. Это потому, что неявный Format-Table
все еще активен и все еще ждет, что вы передаете ему дополнительный объект. Только когда ваша команда полностью завершена Format-Table
подтвердите конец ввода и вывод конца таблицы. Во втором примере явное Format-Table
завершается до Pause
, поэтому вся таблица (включая конец таблицы) была напечатана до команды Pause
.
Разница в размещении конца табличной метки может быть замечена и в предыдущих версиях PowerShell.
Вы используете PowerShell v5? Возможно, это проблема. Https://connect.microsoft.com/PowerShell/Feedback/Details/1635172 Предлагается обходной путь с «Out-Host». –
'pause' использует' Read-Host', см. 'Get-Command pause | Format-List' –
Это новая функция 'Format-Table' в v5. 'Format-Table' собирает ввод в течение 300 миллисекунд (чтобы найти лучшую ширину столбца), прежде чем начинать выводить его. – PetSerAl