【发布时间】:2021-08-16 22:24:07
【问题描述】:
我被一个非常奇怪的现象所困扰。我倾向于为我在工作中所做的事情编写相当深奥的 Powershell 模块。通常,在运行其中一个之后,模块已经结束,我会转移到其他一些任务,当我碰巧再次打开我的 Powershell 控制台窗口时,会出现几个空白行(或只是空白“空格”)缓冲。它永远不会立即出现,这是最令人困惑的部分。
之后,闪烁的光标出现在这个空格的末尾,并且空格不能“退格”(所以不是不小心输入空格或换行符)。它就在那里,作为缓冲区的一部分。我通常只是用cls 清除屏幕以免它打扰我。
我过去常常将此归咎于有缺陷的 Windows Powershell 5.1 缓冲。但是现在我已经开始使用 Powershell 7(和 Windows 终端),我发现问题仍然存在。
这是我的模块完成运行一小时左右后 v7 Windows 终端选项卡的屏幕截图:
有时似乎我等待的时间越长,出现的空白就越多。这是大约 20 小时后同一控制台选项卡的屏幕截图:
很抱歉,我没有更好的方法来解释这一点。我意识到没有任何代码或模式可以分析,按照 SO 标准,这是一个非常糟糕的问题,但我和你一样困惑。我注意到的唯一模式是,这似乎只发生在我运行各种自定义模块之后。然而,这占了我使用 Powershell 的大部分,所以它可能是一个红鲱鱼。
通常我的模块只是做一些处理(与计算机、AD 等对话)并通过Write-Host 输出一些信息,偶尔输出一个[PSCustomObject],我总是将其捕获在一个变量中。即使我不小心向管道输出了一些空白行或其他内容,我也看不出这将如何表现为随着时间的推移而增长的空白缓冲区空间。我想也许我错误地杀死了异步作业或其他东西,这在某种程度上导致了这种情况,但即使在纯同步代码中也会发生这种情况。
需要明确的是,在上面的屏幕截图中没有实际运行的代码。该模块是我在这个特定的控制台选项卡/会话中运行的唯一东西,它不运行任何后台进程。所以我不明白为什么缓冲区会自行改变。在这两个屏幕截图中,选项卡/窗口的大小与模块首次完成时的大小相同,因此动态调整大小的不仅仅是缓冲区中的一堆空格。如前所述,当模块拳头完成时,缓冲区中根本没有流氓字符。
我使用的另一件事是,这一切都是在远程 VM 上完成的,通过 RDP 访问,我每天都使用它。我唯一能想到的另一件事可能是控制台窗口被最小化/最大化/调整大小、分辨率改变或登录会话被连接/重新连接与它有关。
这听起来对任何人来说都很熟悉吗?任何关于可能导致此问题的想法或我可以尝试更好地理解该行为的任何想法都非常感谢。
【问题讨论】:
-
听起来您的脚本中有 1 个或多个语句输出 $null 值。如果您需要帮助弄清楚是什么,请向我们展示您的脚本 :)
-
感谢您的提示。现在我想起来了,我猜当你
Write-Host $null时确实会输出一个空行。当代码甚至没有运行时,我仍然看不出这将如何转化为随着时间的推移添加新行的奇怪行为,但我将在这里查看我的最新创建,看看是否有任何突出。相信我,如果我能查明代码,甚至是我认为可能导致此问题的特定模块,我会发布一些。 -
只是好奇,标准的 powershell 终端或其他类似 windows 终端的东西?
-
@Daniel 我已经使用标准的内置 WindowsPowerShell v5.1 控制台主机看到它已经有一段时间了。我现在继续在由 Windows 终端商店应用程序托管的 PowerShell v7 主机中看到它。我还没有使用标准的内置 Powershell v7 控制台主机或 Windows 终端中托管的 WindowsPowerShell v5.1,不足以注意到这个问题(或者记得注意到这个问题,因为我经常忽略它),但我的怀疑是他们都受到同样的影响。
-
只需在您已安装并在控制台打开时加载的每个模块的开头添加一个
Write-Host "moduleName"行。您必须首先确定罪魁祸首,然后再查看代码。如果任何 cmdlet 或代码行无缘无故地输出空行,我已经看到 cmdlet 这样做了,只需在其末尾打一个| Out-Null,它应该可以解决问题。
标签: powershell powershell-7.0 powershell-5.1