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

通过PSEXEC执行PowerShell菜单脚本时无限循环问题求助

问题解决:远程PowerShell脚本交互菜单无限循环(CMD干扰数据)

核心原因

通过PSEXEC或私有远程工具运行脚本时,工具的输入输出重定向会混入控制字符、空行或自身输出,这些干扰数据被Read-Host读取后,会触发Switch的Default分支,导致无限循环。

彻底解决方案

方案1:严格校验+清理输入,用循环确保有效选择

通过清理输入中的干扰字符(控制符、空白),并强制循环直到用户输入有效选项,从脚本层面过滤无效数据:

$validChoice = $false
do {
    # 读取输入并清理:移除控制字符、首尾空白,统一转大写
    $choix2 = (Read-Host "Faire un choix : O/N") -replace '[\p{C}\s]', '' | ForEach-Object { $_.ToUpper() }
    
    switch ($choix2) {
        'O' {
            # 替换为你的O操作逻辑
            Write-Host "执行O对应的操作"
            $validChoice = $true
        }
        'N' {
            # 替换为你的N操作逻辑
            Write-Host "执行N对应的操作"
            $validChoice = $true
        }
        default {
            Write-Host "无效选择,请输入O或N"
            $validChoice = $false
        }
    }
} while (-not $validChoice)

方案2:直接捕获按键,绕过流干扰

使用[Console]::ReadKey()直接读取用户按键,不依赖Read-Host的流读取逻辑,彻底避免工具重定向带来的干扰:

Write-Host "Faire un choix : O/N"
$validChoice = $false

do {
    # 读取单个按键且不回显
    $key = [Console]::ReadKey($true)
    $choix2 = $key.KeyChar.ToString().ToUpper()

    switch ($choix2) {
        'O' {
            Write-Host "`n执行O对应的操作"
            $validChoice = $true
        }
        'N' {
            Write-Host "`n执行N对应的操作"
            $validChoice = $true
        }
        default {
            Write-Host "`n无效选择,请输入O或N"
            $validChoice = $false
        }
    }
} while (-not $validChoice)

方案3:调整PSEXEC参数,减少远程会话干扰

给PSEXEC添加-i参数,启动交互式远程会话,让PowerShell绑定真实控制台,减少流重定向的干扰:

psexec \\远程机器名 -i powershell -File "C:\脚本路径\你的脚本.ps1"

推荐组合

优先使用方案2+方案3:[Console]::ReadKey()从根源避免流干扰,配合PSEXEC的交互式参数,基本可以彻底消除循环问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:04:59