清除 PowerShell 並保留回滾

清除 PowerShell 並保留回滾

使用該clear指令時,螢幕會清除。完全。我根本無法再訪問以前螢幕上的任何內容。

有沒有辦法“清除”螢幕(即使提示轉到螢幕頂部)而不擦除螢幕上的所有內容?理想情況下,我想“清除”螢幕,但能夠向上滾動以查看其他所有內容。

我正在使用 Windows 終端程式和 PowerShell shell,但我也想知道 Windows 命令列的答案。

我說我想保持向上滾動的能力 - 我的意思是我希望能夠看到在我點擊“清除”命令之前出現的所有內容,所以......是的,我想保留出現的所有內容之前,不是命令歷史記錄。

答案1

PSReadline(PowerShell 的標準輸入處理程序)具有CtrlL大多數 Unix shell 中的熱鍵,它會清除螢幕,就像強制滾動所有文字一樣(就像 ASCII「換頁」字元一樣)。

在 PS5 中,它仍然會刪除顯示的完整的文字 - 但已經進入回滾的所有內容都將保留在回滾中。

作為解決方法,您可以輸出足夠的空白行以將所有內容推入回滾:

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

……然後將遊標移至頂部:

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

這也可以使用 綁定到一個鍵Set-PSReadlineKeyHandler -ScriptBlock

Cmd 沒有等效的東西 - 它以行模式讀取輸入,只有 Conhost 提供的一些捷徑。但是,您仍然可以建立批次腳本(甚至是 Conhost DOSKEY 別名)來輸出相同的 VT 序列。

答案2

雖然清除螢幕是終端函數(透過 ANSI 終端控製程式碼),根據 shell 的不同,發送這些程式碼的方式可能會有所不同。總體思路是:

  • ESC[2J清除螢幕,但保留回滾
  • ESC[3J清除螢幕,包括所有回滾

... 其中ESC表示 ASCII 字元代碼 27。

根據man clearon Linux 的說法,該2J程式碼最初(1999 年)是 XTerm 的擴展,2011 年 Linux 核心將其用於控制驅動程式。一段時間後,Windows 控制台主機拾取了它,並且它可能從一開始就位於 Windows 終端機中。

Windows 終端機(適用於所有 shell)

Windows 終端機包含clearBuffer行動可以綁定到任何熱鍵。但是,它會影響所有 shell無論其中運行什麼應用程式。因此,我建議不要使用它,除非您確定在類似vi(或更糟)的情況下不會意外按下熱鍵。

也就是說,這絕對是在 CMD 中獲得此功能的最簡單方法。

如果您確實想使用它,該clearBuffer操作允許您指定clear以下目標:

  • screen
  • scrollback
  • all

使用該screen選項將清除螢幕的目前內容,但保留回滾。

您需要settings.json直接編輯 Windows 終端,因為 UI 無法設定目標clear

        {
            "command": 
            {
                "action": "clearBuffer",
                "clear": "screen"
            },
            "keys": ""
        }
電源外殼

為了電源外殼, 作為user1684 比我先一步 Ctrl+L發送正確的轉義序列。

另一方面,PowerShell 上的Clear-Host(alias ) 會傳送一個(也清除回滾)。clearESC[3J

如果您對在 PowerShell 中輸入有肌肉記憶clear,則可以簡單地更改其定義:

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

如果您希望它永久存在,請將其放入您的 PowerShell 設定檔中。

指令管理系統

這是可能的,但在 CMD 中也很棘手。

CMD 中最大的問題實際上是列印 ESC 字元(ASCII 27)。我在這裡貼上了實際的“字元”,它將通過複製/貼上傳輸到 CMD,但當我第一次對這篇文章進行另一次編輯時,它被刪除了。該角色仍然存在於該答案的(來源)編輯歷史記錄中,但讓我們找到一種更好的方法來做到這一點。

電源外殼,用它來創建一個指令管理系統批次檔:

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

在 CMD 中執行產生的clear.cmd批次檔應該會清除螢幕(但不會回滾)。

如果您遇到問題,任何可以列印 ASCII 27 和後跟的方法都[2J可以。如果您安裝了 PowerShell Core,例如:

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

只是為了提供有關您的評論之一的一些額外詳細信息:

這看起來要么是世界上最大的設計失敗,要么…………我不知道。我認為至少可能有一個解決方法。

所以,是的,我們已經想出了一個解決方法,但老實說,如果我們沒有這樣做,我不會感到驚訝。請記住,Windows 控制台主機(CMD 過去預設在其中運行)可以追溯到 Windows 95(距今 27 年),遠早於 XTerm 新增這些程式碼。

雖然 Windows 終端更加現代,但我認為自 2006 年 PowerShell 發布以來 CMD(需要產生程式碼)沒有任何實質更新。

真的,我認為我們很幸運,我們有一個解決方法;-)。

Linux 的 Windows 子系統
  • Ctrl+L也可以從許多 Linux shell 發送ESC[2J(保留回溯)。
  • clear將像在 PowerShell 上一樣,清除螢幕向後滾動 ( ESC[3J)。
  • clear -x將保留回滾 ( ESC[2J)

答案3

作為解決方法,在 CMD 中,您可以按住Ctrl↓ (Down arrow)直到螢幕為空。它向下滾動的速度相當快,因此可能會滾動太多。在這種情況下,您可以按Ctrl→ (Right arrow)或開始輸入,提示行會重新彈出到視圖中。任何移動遊標的操作都可以。

不幸的是,這似乎在 Powershell 中不起作用。

答案4

清除 PowerShell 並保留回滾

電源外殼

我曾經Get-Command尋找像Write-Hostor 這樣的 cmdlet Write-Output,因為這不是 powershell 的功能,這看起來真的很奇怪。

Get-Command -CommandType Cmdlet

沒有一個

相關內容