![PowerShell Write-Host nicht synchron](https://rvso.com/image/658747/PowerShell%20Write-Host%20nicht%20synchron.png)
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-WmiObject
asynchron 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-Host
denen, 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 ft
auf dem Bildschirm gedruckt wird, wechselt das Skript zur PageFile-Nachricht.
Sie sollten stattdessen verwenden, Write-Output
um 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-Host
in 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: