PowerShell löschen und Scrollback beibehalten

PowerShell löschen und Scrollback beibehalten

Wenn ich den clearBefehl verwende, wird der Bildschirm gelöscht. Vollständig. Ich habe überhaupt keinen Zugriff mehr auf die Dinge, die vorher auf dem Bildschirm waren.

Gibt es eine Möglichkeit, den Bildschirm zu „löschen“ (also die Eingabeaufforderung an den oberen Bildschirmrand zu bringen), ohne alles zu löschen, was auf dem Bildschirm war? Idealerweise würde ich den Bildschirm gerne „löschen“, aber nach oben scrollen können, um alles andere zu sehen.

Ich verwende das Windows-Terminalprogramm und die PowerShell-Shell, möchte aber auch die Antwort für die Windows-Befehlszeile wissen.

Ich habe angegeben, dass ich die Möglichkeit zum Hochscrollen beibehalten möchte. Damit meine ich, dass ich alles sehen möchten, was passiert ist, bevor ich den Befehl „Löschen“ gedrückt habe. Also … ja, ich möchte alles beibehalten, was vorher passiert ist, nicht den Befehlsverlauf.

Antwort1

PSReadline (der Standardeingabehandler von PowerShell) verfügt über einen CtrlLHotkey, der in den meisten Unix-Shells zu finden ist und der den Bildschirm löscht, als ob Sie den gesamten Text zum Herausscrollen gezwungen hätten (wie es das ASCII-Zeichen „Form Feed“ tun würde).

In PS5 löscht es jedoch immer noch dieangezeigtText vollständig – aber alles, was bereits zum Scrollback gegangen ist, bleibt im Scrollback.

Als Workaround können Sie genügend leere Zeilen ausgeben, um alles in den Scrollback zu schieben:

echo ("`n" * $Host.UI.RawUI.WindowSize.Height)

...und dann den Cursor nach oben bringen:

$e = [char]27
echo "$e[H" # Move cursor to 0;0
echo "$e[J" # Erase down/right

Dies könnte auch mit an eine Taste gebunden werden Set-PSReadlineKeyHandler -ScriptBlock.

Cmd hat kein Äquivalent – ​​es liest die Eingabe im Zeilenmodus, wobei Conhost stattdessen nur einige Tastenkombinationen bereitstellt. Sie können jedoch trotzdem ein Batch-Skript (oder sogar einen Conhost-DOSKEY-Alias) erstellen, das dieselben VT-Sequenzen ausgibt.

Antwort2

Während das Löschen des Bildschirms eineTerminalFunktion (über ANSI-Terminalsteuercodes), die Art und Weise, wie Sie diese Codes erhalten, kann je nach Shell unterschiedlich sein. Die allgemeine Idee ist folgende:

  • ESC[2Jlöscht den Bildschirm, lässt aber den Scrollback
  • ESC[3Jlöscht den Bildschirm, einschließlich aller Scrollback-

... wobei ESCder ASCII-Zeichencode 27 darstellt.

Laut man clearLinux 2Jwar der Code ursprünglich (1999) eine Erweiterung von XTerm, die 2011 vom Linux-Kernel für den Konsolentreiber übernommen wurde. Einige Zeit später wurde er von Windows Console Host übernommen und war wahrscheinlich seit seiner Einführung in Windows Terminal enthalten.

Windows-Terminal (für alle Shells)

Windows Terminal beinhaltet dieclearBufferAktiondie an jeden Hotkey gebunden werden kann. Es wirkt sich jedoch auf alle Shells ausunabhängig davon, welche Anwendung darin ausgeführt wirdvi. Aus diesem Grund rate ich von der Verwendung ab, es sei denn, Sie sind sicher, dass Sie den Hotkey in einer Situation wie dieser (oder Schlimmerem) nicht versehentlich drücken .

Allerdings ist dies definitiv der einfachste Weg, diese Funktionalität in CMD zu erhalten.

Wenn Sie es verwenden möchten, können Sie mit der Aktion ein Ziel clearBufferangeben :clear

  • screen
  • scrollback
  • all

Durch die Verwendung dieser screenOption wird der aktuelle Bildschirminhalt gelöscht, der Scrollback bleibt jedoch bestehen.

Sie müssen Ihr Windows-Terminal settings.jsondirekt bearbeiten, da es in der Benutzeroberfläche keine Möglichkeit gibt, das clearZiel festzulegen:

        {
            "command": 
            {
                "action": "clearBuffer",
                "clear": "screen"
            },
            "keys": ""
        }
Power Shell

FürPower Shell, alsuser1684 war schneller Ctrl+ Lsendet die richtige Escape-Sequenz.

Andererseits sendet Clear-Host(Alias clear​​) in PowerShell ein ESC[3J(und löscht auch den Scrollback).

Wenn Sie über das Muskelgedächtnis zum Tippen clearin PowerShell verfügen, können Sie einfach die Definition ändern:

Remove-Item Alias:clear
function clear {
    Write-Output "$([char]27)[2J"
}

Platzieren Sie dies in Ihrem PowerShell-Profil, wenn Sie es dauerhaft wünschen.

CMD

Dies ist zwar auch in CMD möglich, aber schwierig.

Das größte Problem in CMD ist eigentlich, das ESC-Zeichen (ASCII 27) auszudrucken. Ich hatte das eigentliche „Zeichen“ hier eingefügt, das per Kopieren/Einfügen in CMD übertragen werden würde, aber es wurde gelöscht, als ich das erste Mal eine weitere Bearbeitung an diesem Beitrag vornahm. Das Zeichen ist im (Quell-)Bearbeitungsverlauf für diese Antwort noch vorhanden, aber lassen Sie uns einen besseren Weg finden, dies zu tun.

AusPower Shell, verwenden Sie dies, um einCMDBatchdatei:

@"
@echo off
echo $([char]27)[2J
"@ | Out-File -FilePath .\clear.cmd -Encoding ASCII

Das Ausführen der resultierenden clear.cmdBatchdatei in CMD sollte den Bildschirm löschen (aber nicht das Scrollback).

Wenn Sie damit Probleme haben, sollte es mit jeder Methode funktionieren, mit der Sie ASCII 27 gefolgt von drucken können [2J. Wenn Sie PowerShell Core installiert haben, zum Beispiel:

pwsh -c "Write-Output "`e[2J""

Und um noch ein paar zusätzliche Einzelheiten zu einem Ihrer Kommentare anzugeben:

Das scheint entweder der größte Konstruktionsfehler der Welt zu sein oder ... ich weiß nicht. Ich behaupte, dass es wahrscheinlich zumindest eine Lösung gibt.

Also ja, wir haben eine Problemumgehung gefunden, aber es würde mich ehrlich gesagt nicht überraschen, wenn das nicht der Fall wäre. Denken Sie daran, dass der Windows Console Host (in dem CMD standardmäßig ausgeführt wurde) auf Windows 95 (also 27 Jahre) zurückgeht, also lange bevor XTerm diese Codes überhaupt hinzugefügt hat.

Und obwohl das Windows-Terminal viel moderner ist, glaube ich nicht, dass CMD (das die Codes generieren muss) seit der Veröffentlichung von PowerShell im Jahr 2006 wesentliche Updates erfahren hat.

Ich schätze uns wirklich glücklich, dass wir eine Problemumgehung haben ;-).

Windows-Subsystem für Linux
  • Ctrl+ Lfunktioniert auch von vielen Linux-Shells aus, um ein ESC[2J(Leave Scrollback) zu senden.
  • clearverhält sich wie bei PowerShell und löscht den BildschirmUndzurückblättern ( ESC[3J).
  • clear -xverlässt das Scrollback ( ESC[2J)

Antwort3

Als Workaround können Sie in CMD gedrückt halten, Ctrl↓ (Down arrow)bis der Bildschirm leer ist. Der Scrollvorgang wird ziemlich schnell nach unten durchgeführt, sodass es möglich ist, zu weit zu scrollen. In diesem Fall können Sie drücken Ctrl→ (Right arrow)oder mit der Eingabe beginnen, und die Eingabeaufforderungszeile wird wieder angezeigt. Alles, was den Cursor bewegt, funktioniert.

Dies scheint in Powershell leider nicht zu funktionieren.

Antwort4

PowerShell löschen und Scrollback beibehalten

Power Shell

Früher habe ich Get-Commandnach Cmdlets wie Write-Hostoder gesucht Write-Output, weil es WIRKLICH seltsam erscheint, dass dies keine Funktion von Powershell ist.

Get-Command -CommandType Cmdlet

Es gibt keinen

verwandte Informationen