Wenn ich nach einem Select-Object
-Befehl versuche, zu pausieren oder zu schlafen, geschieht in einigen Fällen die Pause / Ruhe vor der Befehl.
Zum Beispiel mit
%Vor%oder
%Vor%Die Ausgabe ist:
%Vor%Während mit
%Vor%Die Ausgabe ist:
%Vor%Was ist hier los? Ist das ein Fehler oder eine Funktion?
Was Sie sehen, ist eine Folge der neuen PowerShell v5-Funktion. Format-Table
erfasst jetzt 300 Millisekunden lang die Eingabe, um eine bessere Spaltenbreite zu finden. Es funktioniert auch dann, wenn Sie -AutoSize:$false
explizit angeben.
Wenn Sie an der Eingabeaufforderung den Befehl command eingeben, wird dieser Befehl implizit an die einzelne Instanz von Out-Default
command weitergeleitet. Der Befehl Out-Default
entscheidet dann, wie Objekte formatiert und auf dem PowerShell-Host (Konsole) gedruckt werden. Selbst wenn Sie Format-Table
nicht direkt in Ihrem Code verwenden, bedeutet das nicht, dass Sie Format-Table
nicht in Ihrer Pipeline haben. Out-Default
kann entscheiden, Objekte als Tabelle zu formatieren und Format-Table
intern zu verwenden.
Benutzerdefinierte Objekte mit vier oder weniger Eigenschaften und ohne benutzerdefinierte Formatierung, die für sie in Formatdateien definiert sind, werden als Tabelle formatiert. Wenn Sie Select-Object
mit zwei Eigenschaften verwenden, erzeugen Sie genau diese Objekte.
PowerShell-Pipeline ist single-threaded. Das bedeutet, dass Format-Table
nicht nur alle gesammelten Objekte ausgeben kann, wenn ein Intervall von 300 Millisekunden verstrichen ist. Format-Table
müssen warten, bis das nächste Element an sie weitergeleitet wird (Prozessblock aufgerufen) oder das Ende der Pipeline gemeldet (Endblock aufgerufen).
Implizit Format-Table
gibt vor dem ersten Pause
nichts aus (strikt gesagt, leere Zeile drucken), weil es immer noch auf weitere Eingabeobjekte wartet (300 Millisekunden noch nicht verstrichen), um die Spaltenbreite zu bestimmen. Wenn das erste Objekt (# 1) nach 300 Millisekunden kommt (vorausgesetzt, dass Sie nicht schnell sind, wenn Sie Enter drücken), entscheidet Format-Table
über die Spaltenbreite und druckt alle gesammelten Objekte. Weitere Objekte werden ohne Verzögerung gedruckt, können aber die Spaltenbreite nicht mehr beeinflussen. Wenn der Wert zu groß für die Spalte ist, wird er abgeschnitten.
Mit diesem Code wird der Endblock des expliziten Format-Table
vor Pause
ausgeführt. Im Endblock Format-Table
wissen Sie, dass es bereits alle Eingaben erhalten hat, so dass es über die Spaltenbreite entscheiden und alle gesammelten Objekte sofort ausgeben kann. Implizite Out-Default
sehen, dass das Formatieren von Objekten aus Format-Table
output und Out-Default
weiß, dass sie keine zusätzliche Formatierung benötigen und sie auch direkt auf dem Host (Konsole) ausgeben. Die ganze Tabelle wurde also gedruckt, bevor Pause
aufgerufen wurde.
Beachten Sie den Unterschied in der Platzierung der Markierung am Ende der Tabelle (zwei leere Zeilen). Im ersten Beispiel wurde es nach dem letzten Pause
platziert. Weil implizite Format-Table
immer noch aktiv ist und immer noch wartet, übergeben Sie ihr zusätzliches Objekt. Nur wenn Ihr Befehl vollständig abgeschlossen wurde Format-Table
quittieren Ende der Eingabe- und Ausgabeende der Tabellenmarke. Im zweiten Beispiel wird explizit Format-Table
vor Pause
abgeschlossen, sodass die gesamte Tabelle (einschließlich des Endes der Tabellenmarkierung) vor Pause
command gedruckt wurde.
Der Unterschied in der Platzierung der Markierung am Ende der Tabelle kann auch in früheren Versionen der PowerShell festgestellt werden.
Format-Table
hat damit nichts zu tun. Ich versuche in PowerSell V 4.0 und PowerShel V5.0 folgendes und das Problem kann reproduziert werden:
Eine Abzweigung ist:
%Vor%Hier wird wieder pause gemacht:
%Vor%Aber nicht hier
%Vor%Für mich funktioniert in PowerShell V5.0 alles so, als ob der Host nicht in Anweisungen benötigt wird, die pipelineweise ausgeführt werden, dann werden diese Anweisungen asynchron ausgeführt.
Ich hätte gerne, dass Leute wie @Keith Hill sich dieses Verhalten ansehen.
Tags und Links powershell