PowerShell菜单输入选项后对应函数未调用循环刷新问题求助
问题原因分析
- 类型不匹配:
Read-Host返回的输入是字符串类型,代码中直接和数字1-9做等值比较,PowerShell严格类型匹配下会判定为不相等,因此if判断始终不通过,直接进入continue逻辑重新加载菜单 - 函数名不匹配:选项8绑定的调用函数名为
Acronis-Images,但实际定义的函数名为Acronis,名称不一致会导致调用失败 - 输出被立即清屏覆盖:函数执行完成后下一次循环会立刻执行
Clear-Host,用户看不到函数执行的输出内容
修复后完整代码
function PORII { Write-Host " PORII was called" } function DXD-BODY { Write-Host " DXD BODY was called" } function DXD-PAINT { Write-Host " DXD PAINT was called" } function DXD-PTO { Write-Host " DXD PTO was called" } function DXD-TCF { Write-Host " DXD TCF was called" } function FIS-SERVERS { Write-Host " FIS SERVERS was called" } function SERVERS { Write-Host " SERVERS was called" } function Acronis { Write-Host " Acronis was called" } function Menu { param([string]$Title = 'Menu') Write-Host " ==================== $Title ==================== " while ($true) { Clear-Host Write-Host " Press 1 for PORII: " Write-Host " Press 2 for DXD BODY: " Write-Host " Press 3 for DXD PAINT: " Write-Host " Press 4 for DXD PTO: " Write-Host " Press 5 for DXD TCF: " Write-Host " Press 6 for FIS SERVERS: " Write-Host " Press 7 for SERVERS: " Write-Host " Press 8 for Acronis Images: " Write-Host " Press 9 for Exit: " $a = Read-Host -Prompt "`n Enter your option " # 输入转整数并校验范围 if ([int]::TryParse($a, [ref]$opt) -and $opt -ge 1 -and $opt -le 9) { switch($opt) { 1 { PORII } 2 { DXD-BODY } 3 { DXD-PAINT } 4 { DXD-PTO } 5 { DXD-TCF } 6 { FIS-SERVERS } 7 { SERVERS } 8 { Acronis } 9 { exit } } # 输出要求的提示 Write-Host "`nThe function has been called" # 暂停等待用户确认后再刷新菜单 Read-Host -Prompt "`nPress Enter to return to menu" } else { Write-Host "`nInvalid option, please enter a number between 1 and 9" Read-Host -Prompt "`nPress Enter to try again" } } } Menu
关键修改说明
- 新增输入类型转换逻辑,使用
[int]::TryParse把输入的字符串转为整数,避免类型不匹配导致的判断失效 - 修正选项8的调用函数名,和定义的
Acronis保持一致 - 函数执行完成后输出要求的
The function has been called提示 - 新增暂停逻辑,用户按下回车后才会清屏重新加载菜单,可以正常看到执行结果
- 新增非法输入的提示,优化交互体验
内容的提问来源于stack exchange,提问作者Stelian
相关产品推荐
相关产品推荐

