如果 RDP 连接丢失,Powershell ISE 会在脚本执行期间冻结

如果 RDP 连接丢失,Powershell ISE 会在脚本执行期间冻结

我有一个依赖于 ISE 的 powershell 脚本(由于使用表单,无法在正常控制台中正常工作)。

脚本运行时,有时可能需要长达 10 分钟才能完成。但这其实不是什么问题……但如果 Powershell ISE 已打开并且 RDP 连接丢失(例如,另一个用户连接到会话),PowerShell ISE 将变得无响应,并且脚本似乎不再运行。我在本地计算机上使用不同的实例也遇到过同样的情况。例如,如果我锁定我的电脑,也会发生这种情况。

奇怪的是,我仍然可以右键单击 powershell ISE 任务栏条目并弹出窗口。即使 [x] 不再起作用,我也可以从这里关闭。如果我以这种方式关闭,并且脚本中有更改,Powershell ISE 会询问我是否要保存更改并保存,但任何其他形式的交互似乎都是不可能的。

有人知道我该怎么做才能解决这个问题吗?有什么方法可以更新 PowerShell ISE 吗?

服务器是 Windows Server 2016,我的电脑是 Windows 10 Pro x64 v2004

答案1

至于这个...

我有一个依赖于 ISE 的 powershell 脚本(由于使用表单,无法在正常控制台中正常工作)。

从设计上来说,PowerShell.exe 无法原生显示表单。为了能够显示表单,我们需要在脚本的最顶部添加一行代码来支持 WinForm/WPF 表单的渲染。

ISE 使用 powershell_ise.exe,而不是 powershell.exe 或 pwsh.exe(PowerShell Core)。

您的 UX/UI 代码永远不应该依赖代码编辑器来运行。

Add-Type -AssemblyName  Microsoft.VisualBasic,
                        PresentationCore,
                        PresentationFramework,
                        System.Drawing,
                        System.Windows.Forms,
                        WindowsBase,
                        WindowsFormsIntegration

[System.Windows.Forms.Application]::EnableVisualStyles()

网络上的 PowerShell 帮助文件对此进行了详尽的说明。ISE 会自动加载 UX/UI 模块/命名空间,而控制台主机则不会。

根据您在 UX/UI/Form 实现中执行的操作,您不需要列表中的所有内容。

然而,加载上述所有内容不会造成任何损害或影响,并赋予每个内容带来的灵活性。请参阅每个内容的文档。

至于这个...

脚本运行时,有时可能需要长达 10 分钟才能完成

...这不是 UX/UI 问题,而是我们的后端代码,无论您是否有 UX/UI,这都会花费很长时间。

至于这个...

但是,如果 Powershell ISE 已打开并且 RDP 连接丢失(例如,另一个用户连接到会话),PowerShell ISE 将无响应

... 如果您的后端代码停止/挂起,那么您的 UX/UI 就不知道发生了什么,只能等待您的后端代码告诉它执行某些操作。UX/UI 不是代码监视器,也不知道您的后端代码在做什么。UX/UI 只是结果的显示。如果它没有得到要响应的操作/事件,它会根据设计锁定。此外,默认情况下,RDS/RDP 登录到服务器一次不超过两个连接,其中包括控制台。因此,除非您购买并部署所需的每个连接许可证的完整 RDS 许可证,否则您只能看到您所看到的内容。

ISE(或其他代码编辑器)是脚本的编辑器/设计器,而不是脚本的执行器。虽然您可以在那里测试代码,但那是为了调试目的,而不是生产目的。

您在 ISE/VSCode 等中编写代码,但您的目标运行/执行环境是控制台主机。用户无需打开代码编辑器即可运行您的代码。

至于这个...

有人知道我该怎么做才能解决这个问题吗?有什么方法可以更新 PowerShell ISE 吗?

...

  1. 不要在 ISE 中运行此代码,除非您正在设计/调试/测试它?
  2. 将 UX/UI 命名空间添加到脚本顶部。
  3. ISE 没有更新。根据 MS 的说法,当前版本的 Windows PowerShell 5x 和相关 ISE 已弃用。这意味着,除了修复错误/安全问题外,它们都不会再进行任何工作。

MS 表示,尽管不再对 PowerShell v5x 和 ISE 进行任何改进,但 WinPS 和 ISE 将保持现状,并且在可预见的未来它们将出​​现在 OS/.Net 完整版本中。因此,那些喜欢 PSv5 和 ISE 的人可以继续使用它。

PowerShell 6.0 路线图:CoreCLR、向后兼容性等等!

***Windows PowerShell 的未来

Windows PowerShell 5.1 与 .NET Framework 4.x 非常相似,将继续成为 Windows 10 和 Windows Server 2016 的内置受支持组件。

但是,它可能不会收到主要功能更新或低优先级的错误修复***。

借助 > PowerShell Core,我们正在积极解决以前版本的 Windows PowerShell 中可能存在的错误。我们甚至欢迎大家做出贡献,以便我们的社区成员能够修复这些错误。

Windows 管理框架 (WMF) 的发行版本的支持周期没有变化。

因此,所有努力都集中在跨平台 PowerShell Core(即目前适用于 Windows/OSX/Linux 的 PowerShell v7)上。

PowerShell Core 没有 ISE。PowerShell核心的编辑器是Visual Studio Code要将 PowerShell 与 VSCode 一起使用,您需要安装 PowerShell 扩展。

其实,如果您愿意,您可以通过 PowerShell RunSpaces 将 ISE 与 Powershell Core 一起使用。操作方法如下:

https://old.ironmansoftware.com/using-powershell-core-6-and-7-in-the-windows-powershell-ise

但是,使用 VSCode,您可以同时在同一个编辑器中打开多个 shell,这有其优点。

YouTube

“适用于 VSCode 的 PowerShell” https://www.youtube.com/results?search_query=powershel+for+vscode

尽管如此,以上任何一种方法都不能消除脚本中对 GUI 命名空间或其他引用的需求。在使用 UX/UI 内容时,您应该始终在默认使用的任何代码编辑器中使用它们。

最后,对于长时间运行的脚本,您应该真正考虑使用 PowerShell 后台作业。

'PowerShell 作业长期运行脚本'

https://duckduckgo.com/?q=%27powershell+jobs+long+running+scripts%27&t=h_&ia=web

相关内容