如何阻止$Host.UI.PromptForChoice窗口关闭导致Do循环终止?
解决PowerShell菜单窗口关闭后循环终止的问题
我懂你的困扰——本来想让用户必须选一个选项才能继续,结果窗口一关,整个循环直接停了,完全达不到强制选择的效果。核心问题出在这两点:
- 当用户关闭
PromptForChoice弹出的窗口时,PowerShell会抛出OperationCanceledException异常,而你的代码没有捕获这个异常,导致脚本直接终止,循环自然就断了。 - 就算窗口关闭时函数返回
-1(某些场景下的返回值),你的switch语句也没处理这个情况,没法让循环继续触发重新选择。
下面是修改后的代码,完美解决这个问题:
function Choose_Site { [int]$Script:Site_Check = 0 # 用整数类型,避免字符串转换问题 $script:Site_Title = "Please Choose Your Site" $script:Site_Info = "Please Choose Appropriate Site For This Machine" $script:Site_Options = [System.Management.Automation.Host.ChoiceDescription[]] @("&1", "&2", "&3", "&4", "&5", "&A", "&B", "&C", "&D", "&E") [int]$script:Default_Choice = 9 try { $script:Site_Menu = $Host.UI.PromptForChoice($script:Site_Title, $script:Site_Info, $script:Site_Options, $script:Default_Choice) } catch [OperationCanceledException] { # 捕获窗口关闭的异常,提示用户并让循环继续 Write-Host "窗口不能直接关闭,请选择一个选项!" -ForegroundColor Red $script:Site_Menu = -1 # 标记为无效选择 } switch ($script:Site_Menu) { 0 {Write-Host "1" -ForegroundColor Green; $script:Site_Check = 1} 1 {Write-Host "2" -ForegroundColor Green} 2 {Write-Host "3" -ForegroundColor Green} 3 {Write-Host "4" -ForegroundColor Green} 4 {Write-Host "5" -ForegroundColor Green} 5 {Write-Host "A" -ForegroundColor Green} 6 {Write-Host "B" -ForegroundColor Green} 7 {Write-Host "C" -ForegroundColor Green} 8 {Write-Host "D" -ForegroundColor Green} 9 {Write-Host "E" -ForegroundColor Green} -1 {Write-Host "请不要关闭窗口,选择一个有效的选项!" -ForegroundColor Red} # 处理关闭窗口的返回值 } } do { Choose_Site } until ( $Script:Site_Check -ne 0 )
关键修改点说明:
- 异常捕获:用
try/catch块包裹PromptForChoice调用,专门捕获窗口关闭时的OperationCanceledException,这样脚本不会因为用户关闭窗口而终止,而是回到循环重新提示。 - 处理无效返回值:在
switch里添加-1分支,对应窗口关闭时的返回值,提示用户并保持Site_Check为0,确保循环继续。 - 类型规范:把
Site_Check的赋值从字符串"0"/"1"改成整数0/1,避免PowerShell自动类型转换可能带来的潜在问题。
现在测试一下:不管是意外还是故意关闭窗口,脚本都会重新弹出选择菜单,直到用户选择选项1(或者你后续修改的终止条件),完全符合你“必须选择一个选项,不能跳过”的需求。
内容的提问来源于stack exchange,提问作者Clayton Lewis
相关产品推荐
相关产品推荐

