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

PowerShell自动选择菜单计时器不倒计时问题求助

PowerShell菜单超时自动选择功能修复

你的问题根源是**Read-Host是阻塞式命令**——它会暂停整个脚本执行,直到用户输入内容并回车,导致计时器循环完全卡住,只有用户输入后才会继续执行计时判断,所以看起来倒计时没在运行。

要实现非阻塞的输入监听+实时倒计时,需要用.NET的控制台输入API替代Read-Host,以下是修复后的完整代码:

function Show-SimpleMenu {
    Clear-Host
    Write-Host "Simple Menu Options:"
    Write-Host "1. Option 1"
    Write-Host "2. Option 2"
    Write-Host "3. Option 3"
    Write-Host "Q. Quit"

    $timeout = 10
    $timer = [System.Diagnostics.Stopwatch]::StartNew()
    
    while ($true) {
        $elapsedSeconds = [math]::Floor($timer.Elapsed.TotalSeconds)
        $remainingSeconds = $timeout - $elapsedSeconds

        # 超时逻辑
        if ($remainingSeconds -le 0) {
            Write-Host "`rTimeout: Automatically selecting Option 1."
            Option1
            break
        }

        # 实时更新倒计时(覆盖当前行)
        Write-Host "`rTime Remaining: $remainingSeconds seconds | Enter your selection: " -NoNewline

        # 非阻塞检查用户输入
        if ([Console]::KeyAvailable) {
            $key = [Console]::ReadKey($true) # $true表示不回显按键
            $selection = $key.KeyChar.ToString().ToUpper()

            # 处理回车键(可选,确保用户按回车确认输入)
            if ($key.Key -eq [ConsoleKey]::Enter) {
                continue
            }

            # 处理选择逻辑
            switch ($selection) {
                '1' {
                    Write-Host "`rOption 1 selected"
                    Option1
                    break
                }
                '2' {
                    Write-Host "`rOption 2 selected"
                    Option2
                    break
                }
                '3' {
                    Write-Host "`rOption 3 selected"
                    Option3
                    break
                }
                'Q' {
                    Write-Host "`rExiting..."
                    return
                }
                default {
                    Write-Host "`rInvalid selection. Please try again."
                    # 重置计时器,避免输入错误后直接超时
                    $timer.Restart()
                }
            }
            # 处理完有效输入后跳出循环
            if ($selection -match '[1-3Q]') {
                break
            }
        }

        # 控制循环频率,避免占用过高CPU
        Start-Sleep -Milliseconds 200
    }
}

function Option1 {
    Write-Host "`nOption 1 selected"
}

function Option2 {
    Write-Host "`nOption 2 selected"
}

function Option3 {
    Write-Host "`nOption 3 selected"
}

# 调用菜单
Show-SimpleMenu

关键修复点说明:

  1. 非阻塞输入监听:用[Console]::KeyAvailable检查是否有按键输入,只有存在输入时才调用[Console]::ReadKey()读取,避免阻塞循环。
  2. 实时更新倒计时:用Write-Host "r..." -NoNewline`实现行内覆盖,让倒计时在同一位置刷新,避免重复输出。
  3. 输入处理优化:支持按键直接选择(无需回车),对无效输入重置计时器,避免误操作后直接超时。
  4. CPU占用控制:循环中加入Start-Sleep -Milliseconds 200,降低脚本运行时的CPU使用率。

注:PowerShell ISE的控制台环境和原生PowerShell控制台存在差异,部分.NET控制台API在ISE中可能表现异常,建议在原生Windows PowerShell 5.1控制台测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:23:28