![PowerShell Write-Host не синхронный](https://rvso.com/image/658747/PowerShell%20Write-Host%20%D0%BD%D0%B5%20%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9.png)
Я пишу скрипт 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 сначала соберет все результаты, прежде чем устанавливать максимальную ширину для всех элементов. Вы можете оптимизировать вывод, но результаты больше не будут выводиться в реальном времени: