0

我被一个非常奇怪的现象所困扰。我倾向于为我在工作中所做的事情编写相当深奥的 Powershell 模块。通常,在运行其中一个之后,模块已经结束,我会转移到其他一些任务,当我碰巧再次打开我的 Powershell 控制台窗口时,会出现几个空白行(或只是空白“空格”)缓冲。它永远不会立即出现,这是最令人困惑的部分。

之后,闪烁的光标出现在这个空格的末尾,并且空格不能“退格”(所以不是不小心输入空格或换行符)。它就在那里,作为缓冲区的一部分。我通常只是清除屏幕cls以防止它打扰我。

我过去常常把它归结为有缺陷的 Windows Powershell 5.1 缓冲。但是,现在我已经开始使用 Powershell 7(和 Windows 终端),我发现问题仍然存在。

这是我的模块完成运行一小时左右后 v7 Windows 终端选项卡的屏幕截图:

在此处输入图像描述

有时似乎我等待的时间越长,出现的空白就越多。这是大约 20 小时后同一控制台选项卡的屏幕截图:

在此处输入图像描述

对不起,我没有更好的方法来解释这一点。我意识到没有任何代码或模式可以分析,按照 SO 标准,这是一个非常糟糕的问题,但我和你一样困惑。我注意到的唯一模式是,这似乎只发生在我运行各种自定义模块之后。然而,这占了我使用 Powershell 的大部分,所以它可能是一个红鲱鱼。

通常我的模块只是做一些处理(与计算机、AD 等对话)并通过 输出一些信息Write-Host,偶尔输出 a [PSCustomObject],我总是将其捕获在一个变量中。即使我不小心向管道输出了一些空白行或其他内容,我也看不出这将如何表现为随着时间的推移而增长的空白缓冲区空间。我想也许我错误地杀死了异步作业或其他东西,这以某种方式导致了这种情况,但即使在纯同步代码中也会发生这种情况。

需要明确的是,在上面的屏幕截图中没有实际运行的代码。该模块是我在这个特定的控制台选项卡/会话中运行的唯一东西,它不运行任何后台进程。所以我不明白为什么缓冲区会自行改变。在这两个屏幕截图中,选项卡/窗口的大小与模块首次完成时的大小相同,因此动态调整大小的不仅仅是缓冲区中的一堆空格。如前所述,当模块拳头完成时,缓冲区中根本没有流氓字符。

关于我的使用的另一件事是,这一切都是在远程 VM 上完成的,通过 RDP 访问,我每天都使用它。我唯一能想到的另一件事可能是控制台窗口被最小化/最大化/调整大小,分辨率改变,或者登录会话被连接/重新连接与它有关。

这听起来很熟悉吗?任何可能导致这种情况的想法或我可以尝试更好地理解这种行为的任何想法都非常感谢。

4

1 回答 1

0

我已经确认这实际上是简单地“恢复”和“最大化”Powershell 控制台窗口和/或 Windows 终端窗口的直接结果。当问题“存在”时,这样做通常会在光标之前的缓冲区中添加另一“组”空白空间。最小化似乎没有效果,只是从最大化到“恢复”并返回到最大化。

我还确认这与我的自定义模块无关。我可以通过简单地打开一个新的、最大化的控制台窗口/选项卡、运行get-process然后“恢复”和最大化来复制这个问题。不过也不是每次都会发生。

它也与我的自定义配置文件脚本无关,因为即使在没有配置文件的新映像计算机上也会发生这种情况。

在这一点上,我将把它归咎于 powershell 中的缓冲区/渲染/窗口管理器实现错误并继续我的生活。

于 2021-06-03T15:38:37.387 回答