You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:15:24