PowerShell Write-Host nicht synchron

PowerShell Write-Host nicht synchron

Ich schreibe ein PowerShell-Skript, um einige Eigenschaften eines Servers zu überprüfen. Wenn ich die folgenden Cmdlets ausführein Ordnung, wird die Ausgabe nicht in der erwarteten Reihenfolge angezeigt.

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

Ausgabe:

=== Betriebssystem ===

Microsoft Windows Server 2012 Standard

=== Auslagerungsdatei ===

=== Gebietsschema ===

Maximale Größe Name Beschriftung
----------- ---- -------
4000 C:\pagefile.sys C:\ 'pagefile.sys'

0813

Wie kommt es, dass die Pagefile-Ausgabe nicht unter ihrem Titel angezeigt wird? Mir kommt es so vor, als ob das Get-WmiObjectasynchron läuft und sofort den nächsten Titel (Locale) schreibt.

Wie kann ich das verhindern? Bei Verwendung von Write-Output funktioniert es zwar, allerdings kann ich dann keinen farbigen Text mehr verwenden.

Antwort1

Ein Teil des Textes auf dem Bildschirm stammt von Objekten, die durch diePowerShell-Pipeline, und einige kommen von Write-Hostdenen, die sofort auf dem Bildschirm ausgedruckt werden, ohne die Pipeline zu berühren.

Das Erfassen von WMI-Informationen über die Auslagerungsdatei nimmt Zeit in Anspruch und führt zu Ausgaben an die Pipeline, das Skript war jedoch bereits mit dem Drucken der Gebietsschemanachricht fortgefahren, bevor diese Pipeline fertig war.

Dies geschieht nicht für (Betriebssystem), da diese Pipeline mit ft -AutoSize(Format-Table) endet, wodurch das Skript angehalten wird und auf alles in der Pipeline gewartet wird, damit es bei der Entscheidung über die Spaltengröße so viele Informationen wie möglich hat. Sobald ftauf dem Bildschirm gedruckt wird, wechselt das Skript zur PageFile-Nachricht.

Sie sollten stattdessen verwenden, Write-Outputum den Text durch die Pipeline zu senden. Auf diese Weise lässt er sich gut in andere PowerShell-Funktionen wie die Umleitung und das Sammeln von Befehlsausgaben in Dateien und Variablen integrieren.

Jeffrey Snover (leitender Architekt von PowerShell) hat Write-Hostin seinem Blog hier darüber geschrieben, warum dies nicht empfohlen wird:http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

Hier ist ein Link, der das Verhalten von beschreibt Format-Table:

Optimieren der Spaltenbreite

Da die Pipeline die Ergebnisse in Echtzeit verarbeitet, kann PowerShell nicht wissen, wie viel Platz die Spaltenelemente einnehmen werden. Daher wird es bei der Größenanpassung der Spalten eher großzügig sein. Wenn Sie den Parameter -AutoSize angeben, sammelt Format-Table zuerst alle Ergebnisse, bevor die maximale Breite für alle Elemente festgelegt wird. Sie können die Ausgabe optimieren, aber die Ergebnisse werden nicht mehr in Echtzeit ausgegeben:

Master-PowerShell | Mit Dr. Tobias Weltner

verwandte Informationen