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

PowerShell菜单脚本Switch语句退出时重复执行上一次命令问题

问题根因

你遇到的现象核心是$Actions变量没有在每次循环开始时重置:当你输入Q/q触发退出时,第一个switch分支没有匹配到对应处理逻辑,$Actions会保留上一次选择时的赋值内容,第二个switch就会执行上一次选择对应的命令,命令执行完成后才会走到until判断逻辑退出循环,所以会出现选退出还会先跑一遍之前命令的问题。同时你当前的退出判断只匹配小写q,如果输入大写Q也会出现无法正常退出的问题。

修复方案

按以下逻辑调整代码即可:

  1. 每次循环开头清空$Actions变量,避免残留上一次的赋值
  2. 补充Q/q的匹配分支,同时优化退出判断的大小写兼容性
  3. 执行命令前先判断$Actions是否存在有效赋值,无值时直接跳过执行

修复后的完整代码如下:

function Show-Menu {
    param (
        [string]$Title = 'Menu'
    )
    Clear-Host
    Write-Host "`n============= $Title =============`n"
    Write-Host "Press 'A' to run all commands"
    Write-Host "Press '1' to run foo"
    Write-Host "Press '2' to run bar"
    Write-Host "Press 'Q' to quit"
}

do {
    Show-Menu
    # 每次循环先清空Actions变量,避免残留上一次的结果
    $Actions = $null
    $Selection = Read-Host "`nPlease make a selection"

    switch ($Selection) {
        { $_ -eq 'A' -or $_ -eq 'a' } {
            $Actions = @('foo', 'bar')
        }
        '1' {
            $Actions = "foo"
        }
        '2' {
            $Actions = "bar"
        }
        # 补充Q/q的匹配,这里不需要额外操作,Actions保持为空即可
        { $_ -eq 'Q' -or $_ -eq 'q' } {
            continue
        }
        # 可选:补充默认分支处理无效输入
        default {
            Write-Host "无效输入,请重新选择"
            Start-Sleep -Seconds 1
            continue
        }
    }
    
    # 只有Actions有值时才执行命令
    if ($null -ne $Actions) {
        switch ( $Actions ) {
            'foo' { 
                Write-Host "foo executed"
                Start-Sleep -Seconds 2
            }
            'bar' { 
                Write-Host "bar executed"
                Start-Sleep -Seconds 2
            }
        }
    }
}
# 不区分大小写判断退出
until ($Selection.ToLower() -eq 'q')

内容的提问来源于stack exchange,提问作者TechFA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:00