如何在PowerShell脚本中循环多次打开WPF窗口直至触发停止条件
PowerShell WPF窗口循环加载实现方案
修改后可直接运行的代码
[System.Reflection.Assembly]::LoadWithPartialName("PresentationFramework") | Out-Null function Import-Xaml { # 此处替换为你自己的XAML文件实际路径 [xml]$xaml = Get-Content -Path "C:\Users\Test\WpfWindow1.xaml" $manager = New-Object System.Xml.XmlNamespaceManager -ArgumentList $xaml.NameTable $manager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml"); $xamlReader = New-Object System.Xml.XmlNodeReader $xaml [Windows.Markup.XamlReader]::Load($xamlReader) } # 循环控制变量,需要停止流程时将该值设为$false即可 $running = $true while ($running) { # 每次循环生成全新的窗口实例,避免资源释放后无法复用的问题 $currentWindow = Import-Xaml $targetButton = $currentWindow.FindName("Button") # 绑定当前窗口按钮的点击事件 $targetButton.Add_Click({ $this.Parent.Close() }) # 模态显示窗口,代码会阻塞到窗口被手动关闭或按钮点击关闭 $currentWindow.ShowDialog() # 下方放置你需要执行的自定义脚本逻辑 # 如需停止循环,可在该段逻辑中添加判断,满足条件时设置 $running = $false # Run Code }
关键逻辑说明
- 取消了提前预生成多个窗口实例的写法,改为每次循环动态生成新的窗口实例,解决WPF窗口资源释放后无法重复加载渲染的问题
- 按钮点击事件使用
$this.Parent.Close()实现,无需依赖外部循环变量,规避了PowerShell闭包作用域导致的变量关联错误,保证每一轮窗口的按钮都能正常触发关闭 - 用
$running全局变量控制循环启停,你可以在自定义脚本执行段添加任意停止判断逻辑,满足条件时修改该变量值即可终止整个流程 - 依托
ShowDialog()的模态阻塞特性,确保窗口完全关闭后才会执行后续自定义脚本,再进入下一轮窗口加载流程,完全符合要求的执行顺序
内容的提问来源于stack exchange,提问作者Simply Uncensored
相关产品推荐
相关产品推荐

