Kann nach Select-Objekt nicht pausieren oder nicht schlafen

8

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?

    
Mica 17.01.2016, 05:10
quelle

2 Antworten

6

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).

%Vor%

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.

%Vor%

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.

    
PetSerAl 18.01.2016 15:56
quelle
1

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:

%Vor%

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.

    
JPBlanc 18.01.2016 06:48
quelle

Tags und Links