多运行空间 PowerShell/XAML 脚本在单击按钮时崩溃



我有一个脚本,它使用异步运行空间,以便在后台处理内容时显示 XAML/WPF GUI。当我单击按钮时,它会崩溃,但仅在处于特定状态时崩溃。让我详细说明一下。

该脚本首先对一长串服务器执行 ping 操作,以确保它们已启动。之后,它运行一些 SQL 查询、WMI 调用和其他逻辑,处理所有数据,然后在另一个窗口中使用信息一次更新一行我的 DataGrid。

该按钮只是显示一个WinForm确认:

#$Global:uihash is my synchronized hashtable.
$Global:uihash.Button.add_click({if([System.Windows.Forms.MessageBox]::Show `
("Yes or No?", "Question",[System.Windows.Forms.MessageBoxButtons]::OKCancel) -eq "OK")
{Do stuff back in main PS Window}

如果我在脚本 ping 所有设备时按下按钮,它可以完美运行。如果我在脚本过程中的任何其他时间单击该按钮,PS Windows会立即翻转为无响应,我必须杀死它们。

从应用程序事件日志:

程序PowerShell_ISE.exe版本 10.0.10586.117 已停止 与Windows交互并已关闭。

我大概 95% 确定这是因为 ping 设备是脚本中唯一与其他窗口绝对零交互的部分,我只是不知道如何解决这个问题,甚至不知道如何解决它。

我想知道以前是否有人见过或经历过这个或类似的事情,以及你是如何绕过它的。任何帮助将不胜感激。谢谢!

我永远无法完全弄清楚这一点,但我确实为我找到了一个很好的解决方法。我将脚本的主要块放在一个Do-Until循环中,并使按钮单击更改我创建的全局变量。这打破了循环,关闭了窗口,让所有完成任务运行而不会崩溃。

#$Global:uihash is my synchronized hashtable.
#Create synchronized hash table variable
$Global:uiHash.Add(“End”,$false)
#Create Click Event 
$Global:uihash.Button.add_click({if([System.Windows.Forms.MessageBox]::Show 
("Yes or No?", "Question",[System.Windows.Forms.MessageBoxButtons]::OKCancel) -eq "OK")
{$Global:uiHash.End = $true}
Do {A whole bunch of stuff}
Until ($global:uiHash.end -eq $true)
#Close the window
$Global:uiHash.Window.Dispatcher.Invoke([action]{$Global:uiHash.Window.close() },"Normal")
#Then process the rest of the script

最新更新