PowerShell Write-Host не синхронный

PowerShell Write-Host не синхронный

Я пишу скрипт PowerShell для проверки некоторых свойств сервера. Когда я выполняю следующие командлетычтобы, вывод отображается не в том порядке, который я ожидаю.

Write-Host "=== Operating System ==="
Get-WmiObject -computername $ServerName -class Win32_OperatingSystem | select Caption | ft -HideTableHeaders -AutoSize

Write-Host "=== Pagefile ==="
Get-WmiObject -ComputerName $ServerName -Class Win32_PageFileSetting

Write-Host "=== Locale ==="
Get-WmiObject -ComputerName $ServerName -class Win32_OperatingSystem | select Locale | ft -HideTableHeaders -AutoSize | Write-Output

Выход:

=== Операционная система ===

Microsoft Windows Server 2012 Стандартный

=== Файл подкачки ===

=== Локаль ===

Максимальный размер Имя Заголовок
----------- ---- -------
4000 C:\pagefile.sys C:\ 'pagefile.sys'

0813

Как так получается, что вывод файла подкачки не отображается под его заголовком? Мне кажется, что он Get-WmiObjectработает асинхронно и сразу пишет следующий заголовок (Locale).

Как это предотвратить? Это работает при использовании Write-Output, но тогда я не могу использовать цветной текст.

решение1

Часть текста на экране появляется из-за объектов, проходящих через него.Конвейер PowerShell, а некоторые исходят из Write-Hostтого, что печатается на экране немедленно, не касаясь конвейера.

Сбор информации WMI о файле подкачки занимает время и выводит данные в конвейер, но скрипт уже перешел к печати сообщения Locale до того, как этот конвейер завершил работу.

Этого не происходит для (Operating System), потому что этот конвейер завершается ft -AutoSize(Format-Table), который останавливает скрипт и ждет все в конвейере, чтобы иметь как можно больше информации при принятии решения о размере столбцов. После ftпечати на экране скрипт переходит к сообщению PageFile.

Вместо этого следует использовать Write-Output, чтобы отправить текст по конвейеру. Таким образом, он будет хорошо интегрироваться с другими функциями PowerShell, такими как перенаправление, сбор выходных данных команд в файлы и переменные.

Джеффри Сновер (ведущий архитектор PowerShell) написал Write-Hostв своем блоге о том, почему это не рекомендуется:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

Вот ссылка, описывающая поведение Format-Table:

Оптимизация ширины столбца

Поскольку конвейер обрабатывает результаты в реальном времени, PowerShell не может знать, насколько широкое пространство займут элементы столбцов. В результате он будет склонен щедро задавать размеры столбцов. Если указать параметр -AutoSize, Format-Table сначала соберет все результаты, прежде чем устанавливать максимальную ширину для всех элементов. Вы можете оптимизировать вывод, но результаты больше не будут выводиться в реальном времени:

Master-PowerShell | С доктором Тобиасом Вельтнером

Связанный контент