清除 PowerShell 并保留回滚

清除 PowerShell 并保留回滚

使用该clear命令时,屏幕会完全清除。我再也无法访问屏幕上之前显示的任何内容。

有没有办法“清除”屏幕(即让提示符移到屏幕顶部)而不删除屏幕上的所有内容?理想情况下,我希望“清除”屏幕,但能够向上滚动以查看其他所有内容。

我正在使用 Windows 终端程序和 PowerShell shell,但我也想知道 Windows 命令行的答案。

我说我想保持向上滚动的能力——我的意思是我想能够看到在我点击“清除”命令之前的所有内容,所以......是的,我想保留之前的所有内容,而不是命令历史记录。

答案1

PSReadline(PowerShell 的标准输入处理程序)具有CtrlL大多数 Unix shell 中的热键,它会清除屏幕,就像您强制所有文本滚动出去一样(就像 ASCII 的“Form Feed”字符一样)。

不过在 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 clearLinux 的说法,该2J代码最初(1999 年)是 XTerm 的一个扩展,2011 年被 Linux 内核采纳用于控制台驱动程序。一段时间后,Windows Console Host 采纳了它,它可能自 Windows Terminal 诞生之日起就一直存在。

Windows 终端(适用于所有 shell)

Windows 终端包括clearBuffer行动可以绑定到任何热键。但是,它会影响所有 shell无论其中运行的是什么应用程序。因此,我不建议使用它,除非您确定在类似vi(或更糟糕的)情况下不会意外按下热键。

也就是说,这绝对是在 CMD 中获取此功能的最简单方法。

如果您确实想使用它,该clearBuffer操作允许您指定clear以下目标:

  • screen
  • scrollback
  • all

使用该screen选项将清除屏幕的当前内容但保留回滚。

您需要settings.json直接编辑 Windows 终端,因为 UI 没有办法设置clear目标:

        {
            "command": 
            {
                "action": "clearBuffer",
                "clear": "screen"
            },
            "keys": ""
        }
电源外壳

为了电源外壳, 作为用户1684 抢先了 Ctrl+L发送正确的转义序列。

另一方面, PowerShell 上的Clear-Host(别名clear) 发送ESC[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 Terminal 更加现代化,但我认为自 2006 年 PowerShell 发布以来,CMD(需要生成代码)没有进行过任何实质性的更新。

真的,我很幸运我们找到了解决方法;-)

适用于 Linux 的 Windows 子系统
  • Ctrl+L还可以从许多 Linux shell 发送ESC[2J(leave scrollback)。
  • clear就像在 PowerShell 中一样,清除屏幕回滚(ESC[3J)。
  • clear -x将离开回滚(ESC[2J

答案3

解决方法是,在 CMD 中,您可以按住Ctrl↓ (Down arrow)直到屏幕空白。它会相当快地向下滚动,因此可能会滚动太多。在这种情况下,您可以按下Ctrl→ (Right arrow)或开始输入,提示行会重新弹出到视图中。任何移动光标的操作都可以。

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

答案4

清除 PowerShell 并保留回滚

电源外壳

我曾经Get-Command寻找过像Write-Host或者这样的 cmdlet Write-Output,因为这不是 powershell 的功能,这看起来真的很奇怪。

Get-Command -CommandType Cmdlet

没有

相关内容