PowerShell菜单脚本Switch语句退出时重复执行上一次命令问题
问题根因
你遇到的现象核心是$Actions变量没有在每次循环开始时重置:当你输入Q/q触发退出时,第一个switch分支没有匹配到对应处理逻辑,$Actions会保留上一次选择时的赋值内容,第二个switch就会执行上一次选择对应的命令,命令执行完成后才会走到until判断逻辑退出循环,所以会出现选退出还会先跑一遍之前命令的问题。同时你当前的退出判断只匹配小写q,如果输入大写Q也会出现无法正常退出的问题。
修复方案
按以下逻辑调整代码即可:
- 每次循环开头清空
$Actions变量,避免残留上一次的赋值 - 补充Q/q的匹配分支,同时优化退出判断的大小写兼容性
- 执行命令前先判断
$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
相关产品推荐
相关产品推荐

