我被一种非常奇怪的现象所困扰。我倾向于为我在工作中所做的事情编写相当深奥的Powershell模块。通常,在运行其中一个之后,模块已经结束,我将转移到其他一些任务上,当我再次打开Powershell控制台窗口时,缓冲区中将出现几行空行(或仅为空白“空格”)。它永远不会马上出现,这是最令人困惑的部分。
之后,闪烁的光标出现在这个空格的末尾,空白不能被“后置”(所以它不是无意中输入空格或换行符)。就在那里,作为缓冲的一部分。我通常只是清除屏幕与cls,以防止它烦扰我。
我过去常常把这归功于buggy的5.1缓冲。然而,现在我已经开始使用Powershell 7(和Windows终端),我发现这个问题仍然存在。
下面是模块运行后大约一个小时的v7 Windows终端选项卡的屏幕截图:

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

对不起,我没有更好的方法解释这件事。我意识到,如果没有任何代码或模式来分析,这是一个非常糟糕的问题,按这样的标准来衡量,但我和你一样困惑。我注意到的唯一模式是,这似乎只发生在我运行我的各种自定义模块之后。然而,这在我的Powershell使用中占了大部分,因此它可能是一种红鲱鱼。
通常,我的模块只需进行一些处理(与计算机、AD等对话),只需通过Write-Host输出一些信息,偶尔输出一个[PSCustomObject],我总是在变量中捕获它。即使我无意中向管道输出了一些空行或其他东西,我也看不出它是如何显示为随时间增长的空白缓冲区空间的。我想,我可能是不正确地杀死异步作业或其他什么的,这在某种程度上导致了这一点,但这种情况甚至发生在纯同步代码中。
要明确的是,在上面的屏幕截图中没有实际运行的代码。该模块是我在这个特定控制台选项卡/会话中唯一运行的模块,它不运行任何后台进程。所以我不明白为什么缓冲区要自己改变。在这两个屏幕截图中,制表符/窗口的大小都与模块第一次完成时的大小相同,因此它不仅仅是缓冲区中的一堆正在动态调整大小的空间。正如所指出的,当模块第一次完成时,缓冲区中根本没有流氓字符。
关于我的用法的另一件事是,它都是在远程VM上完成的,通过RDP访问,我每天都使用RDP。我唯一能想到的另一件事是,控制台窗口被最小化/最大化/调整大小,分辨率改变,或者登录会话被连接/重新连接,可能与此有关。
这听起来很熟悉吗?任何可能导致这种情况的想法,或者我可以尝试更好地理解这种行为的想法,都是非常感谢的。
发布于 2021-06-03 15:38:37
我已经确认,这实际上是“恢复”和“最大化”Powershell控制台窗口和/或Windows终端窗口的直接结果。当问题“存在”时,这样做通常会在游标之前向缓冲区添加另一组空白。最小化似乎没有任何效果,只是从最大化到“恢复”,再回到最大化。
我还确认这与我的自定义模块无关。我只需打开一个新的、最大化的控制台窗口/选项卡,运行get-process,然后“恢复”并最大化,就可以复制这个问题。但这并不是每次都发生的。
它也与我的自定义配置文件脚本无关,就像它发生在一台没有配置文件的新映像计算机上一样。
此时,我将回到将其归咎于powershell中的缓冲区/呈现/窗口管理器实现错误,并继续我的生活。
https://stackoverflow.com/questions/67742792
复制相似问题